Applying States to Single-Page Application (SPA)
Learn how to manage data, handle user interactions, and synchronize views in a single-page application.
We'll cover the following...
Integrating states with a single-page application
We'll start building a single-page application. We'll implement a funtionality to switch to a different page other than the home page. We'll put together a Nav component:
const Nav = ({ items, selected }) => { ... }
Given a list of pages, the Nav component displays them as links to navigate. The currently selected page needs to be provided as well. Now that we know how to define a state, let's use it to keep track of the selected page:
const App = () => {// Get the currently selected item from the shared state (default: "home")const selected = _getM("home");// Render the 'Nav' component with menus, the selected item, and a callback to update the shared statereturn (<div><Navitems={menus}selected={selected}onSelect={_setM}/></div>);};
In the App component, we use a state for selected to hold the home key initially, which is then pass into the Nav component. To allow the state to be updated after a user clicks, we need to modify Nav by adding the support of an onSelect callback function:
const Nav = ({ items, selected, onSelect }) => {// Function to check if a menu item is currently activeconst isActive = (item) => item.key === selected;// Function to handle click events on menu items and update the selected itemconst onClick = (item) => () => {onSelect(item.key);};return ();};
In the amended Nav component, an onSelect prop is passed so that after onClick, the parent App component can be notified to update the selected page via the _setM function.
To confirm that the user does reach a different page, based on the current selected page, we can use a Route component to switch between page content:
const Route = ({ selected }) => {// Conditionally render content based on the selected itemreturn (<div>{selected === 'home' && <Home />} {/* Render 'Home' component if selected is 'home' */}{selected === 'product' && <Product />} {/* Render 'Product' component if selected is 'product' */}</div>);};
What the preceding Route component does is display the page content based on the ...