Հայերեն
English
Русский
Lesson 20: Routing in React with React Router
Introduction to Client-Side Routing
What is Client-Side Routing?
Client-side routing is a fundamental concept in modern web development, particularly relevant in the context of Single Page Applications (SPAs). Unlike traditional server-side routing, where each new page request initiates a full page reload, client-side routing handles navigational actions within the browser without requiring a page refresh. This approach changes how content is loaded and displayed when users interact with an application, relying heavily on JavaScript to manage URL changes and view rendering.
Comparison to Server-Side Routing:
- Server-Side Routing:
- Each route change sends a new request to the server.
- The server processes the request, performs necessary operations (like querying a database), and returns a fully rendered page to the client.
- This process can be slower due to the round-trip time, especially if only part of the page needs to be updated.
- Client-Side Routing:
- Navigation between different parts of the application doesn't involve reaching out to the server to fetch new HTML.
- Instead, the routing is handled internally by the JavaScript loaded on the page.
- The browser does not reload the whole page but dynamically updates the content that needs to change.
Role in SPAs:
In Single Page Applications (SPAs), client-side routing plays a pivotal role. SPAs load a single HTML page and dynamically update that page as the user interacts with the app. Client-side routers in JavaScript frameworks like React, Angular, or Vue.js manage these updates without additional page loads, making the experience smoother and more like a desktop application.
Advantages of Client-Side Routing
Faster Transitions:
- Since resources are only loaded once during the initial page load, and only data might be fetched asynchronously without page refresh, transitions between pages/views are generally much faster.
- Reduces the amount of data transferred over the network.
Improved User Experience:
- The interface feels more fluid and responsive. There’s no flicker of page reloads, making the application feel like a native app.
- Maintains user state and context without the need for complex server-side handling.
Separation of Frontend and Backend Responsibilities:
- Client-side routing allows developers to separate the concerns of presenting the user interface from data processing and handling on the server.
- The backend can be simplified to serve APIs (a set of subroutine definitions, protocols, and tools for building software and applications) which the frontend consumes. This architectural style is commonly known as the API-first approach where the server provides RESTful or GraphQL APIs.
Efficient Data Management:
- Since the client handles the UI routing, the server is tasked primarily with data management, which can lead to more efficient server performance.
- Allows for caching strategies on the client side to reduce even the data fetching requirements.
Enhanced Capabilities with Modern Browsers:
- Client-side routing leverages capabilities of modern browsers, such as the History API, which allows for manipulation of the browser session history that is part of the HTML5 specification.
In summary, client-side routing is a key component of building fast and interactive SPAs. It enhances the user experience by reducing load times and making applications feel more seamless. However, it requires careful consideration of routing strategies, potential SEO impacts, and initial loading performance.
Getting Started with React Router
React Router is a standard library for routing in React applications. It enables the implementation of dynamic routing in a web app, which means the routing takes place as the user interacts with the app, without a page reload. Let's dive into how to set up React Router in your project, understand its core components, and see it in action.
Installing React Router
React Router comes in two flavors depending on the environment you are targeting:
react-router-dom
for Web Applications:
react-router-native
for React Native Applications:
Both packages share similar concepts and components but are optimized for their respective environments.
Basic Components of React Router
1. BrowserRouter
:
- A
<BrowserRouter>
uses the HTML5 history API (pushState, replaceState, and the popstate event) to keep your UI in sync with the URL.
- It should be used as a wrapper around the entire part of your app that should be controlled by React Router.
2. Route
:
- The
<Route>
component is used to declare what should be rendered based on the URL path. It’s the core building block of React Router.
- Each Route maps a path to a component.
3. Link
and NavLink
:
<Link>
components are used to create links in your application. They work like <a>
tags in HTML but are designed to work with React Router's in-app navigation.
<NavLink>
is similar to <Link>
but it includes styling attributes that help you automatically style the active link. You can specify styles or classes to be applied to the link when it matches the current URL.
4. Switch
:
- The
<Switch>
component is used to group <Route>
components and render only the first one that matches the current location. It’s useful for defining exclusive routes where only one route should be rendered at a time.
Setting Up a Basic Route
Setting up routing in a React application using React Router involves wrapping your application in a <BrowserRouter>
and then defining <Route>
components for different paths. Here's a simple example:
import React from 'react';
import { BrowserRouter, Route, Link, Switch } from 'react-router-dom';
function Home() {
return <h2>Home Page</h2>;
}
function About() {
return <h2>About Page</h2>;
}
function App() {
return (
<BrowserRouter>
<div>
<nav>
<ul>
<li>
<Link to="/">Home</Link>
</li>
<li>
<Link to="/about">About</Link>
</li>
</ul>
</nav>
{/* A <Switch> looks through its children <Route>s and
renders the first one that matches the current URL. */}
<Switch>
<Route path="/about">
<About />
</Route>
<Route path="/">
<Home />
</Route>
</Switch>
</div>
</BrowserRouter>
);
}
In this setup:
- The
App
component contains a <BrowserRouter>
wrapper.
- Inside, there's a simple navigation bar with links defined using
<Link>
.
<Switch>
and <Route>
components define the mapping of paths to components, ensuring only the corresponding component renders when the URL matches the route's path.
This basic introduction sets the stage for creating more complex navigational structures in your React applications, leveraging the powerful routing capabilities provided by React Router.
Advanced Routing Concepts
Dynamic Routing with Route Parameters
Dynamic routing allows you to accept different parts of the URL as parameters, making the route itself flexible and capable of handling a variety of input values. This technique is especially useful when you need to display or operate on different data based on URL parameters, such as displaying different user profiles or product details.
Defining Dynamic Routes:
- You define dynamic routes in React Router by specifying parameters in the path prop of the
Route
component. A colon :
precedes the name of the parameter.
<Route path="/profile/:userId" component={UserProfile} />
In this example, :userId
is a route parameter that can be accessed within the UserProfile
component to load specific user data.
Example with Parameters: User Profile Page
Let's create a simple user profile page that fetches and displays user data based on a userId passed as a URL parameter.
UserProfile Component:
import React, { useState, useEffect } from 'react';
import { useParams } from 'react-router-dom';
function UserProfile() {
const [user, setUser] = useState(null);
const { userId } = useParams();
useEffect(() => {
fetch(`https://api.example.com/users/${userId}`)
.then(response => response.json())
.then(data => setUser(data));
}, [userId]);
return (
<div>
{user ? (
<div>
<h1>{user.name}</h1>
<p>Email: {user.email}</p>
</div>
) : (
<p>Loading...</p>
)}
</div>
);
}
This component uses the useParams
hook from React Router to access the userId
parameter. It then fetches user data from an API based on this ID.
Programmatic Navigation
Sometimes, you need to perform navigation actions programmatically, such as after a form submission or a successful asynchronous operation.
Using useHistory
Hook:
- The
useHistory
hook gives you access to the history instance that you may use to navigate.
import { useHistory } from 'react-router-dom';
function FormSubmitButton() {
let history = useHistory();
function handleSubmit() {
performAsyncOperation().then(() => {
history.push('/success'); // Navigate programmatically
});
}
return <button onClick={handleSubmit}>Submit</button>;
}
Nested Routing
Nested routing allows you to create a hierarchy of routes, which is useful for having a consistent layout across different components or sub-components.
Example of Nested Routing:
<Route path="/user" component={UserLayout}>
<Route path="/user/profile" component={UserProfile} />
<Route path="/user/settings" component={UserSettings} />
</Route>
In this setup, UserLayout
could include a navbar or sidebar common to all user-related routes, while UserProfile
and UserSettings
handle specific views.
Protected Routes and Authentication
Protected routes are routes that require the user to be authenticated. React Router doesn't include built-in support for protected routes, but you can easily implement them by combining your authentication logic with route rendering.
Example of a Protected Route:
import { Route, Redirect } from 'react-router-dom';
function ProtectedRoute({ component: Component, ...rest }) {
return (
<Route {...rest} render={
props => isAuthenticated() ? (
<Component {...props} />
) : (
<Redirect to='/login' />
)
} />
);
}
In this example, ProtectedRoute
checks if the user is authenticated. If yes, it renders the requested component; if not, it redirects the user to the login page.
These advanced routing techniques empower you to build complex, user-friendly, and secure applications using React Router, enhancing both the developer and user experience by providing dynamic, conditional, and nested routing solutions.
Practical Exercise - Building a Multi-Page SPA
Exercise Overview
In this exercise, students will build a small Single Page Application (SPA) that includes multiple components such as a homepage, an about page, a contact form, and user profiles. Each part of the application will be accessible via distinct routes, demonstrating the power and flexibility of client-side routing with React Router.
Goals of the Exercise:
- Familiarize with React Router: Understand how to set up and manage routes using React Router.
- Implement Dynamic and Nested Routing: Use dynamic routing for user profiles and nested routes for organizing related views.
- Utilize Programmatic Navigation: Handle redirection after events like form submissions.
Implementing Features
1. Setup Basic Routing:
- First, ensure the application has the necessary pages: Home, About, Contact, and User Profile.
- Set up React Router in the application by wrapping the entire app in a
<BrowserRouter>
.
Example:
import React from 'react';
import { BrowserRouter as Router, Route, Switch, NavLink } from 'react-router-dom';
import Home from './Home';
import About from './About';
import Contact from './Contact';
import UserProfile from './UserProfile';
function App() {
return (
<Router>
<div>
<nav>
<ul>
<li><NavLink exact to="/" activeClassName="active">Home</NavLink></li>
<li><NavLink to="/about" activeClassName="active">About</NavLink></li>
<li><NavLink to="/contact" activeClassName="active">Contact</NavLink></li>
</ul>
</nav>
<Switch>
<Route path="/" exact component={Home} />
<Route path="/about" component={About} />
<Route path="/contact" component={Contact} />
<Route path="/user/:userId" component={UserProfile} />
</Switch>
</div>
</Router>
);
}
2. Dynamic Routing for User Profiles:
- Implement dynamic routing to handle user profiles where the user ID is captured from the URL.
- This allows the
UserProfile
component to fetch and display data based on the provided ID.
3. Nested Routing:
- Use nested routing within the About section if it has multiple sub-sections, such as company history, team, etc.
- This approach helps organize complex structures within a single route, maintaining a clean and manageable code structure.
Example of Nested Routing:
<Route path="/about" component={About}>
<Route path="/about/history" component={History} />
<Route path="/about/team" component={Team} />
</Route>
4. Programmatic Navigation after Form Submission:
- In the contact form, use the
useHistory
hook from React Router to navigate programmatically to a thank-you page or back to the home page after the form is submitted.
Example:
import { useHistory } from 'react-router-dom';
function ContactForm() {
let history = useHistory();
function handleSubmit(event) {
event.preventDefault();
// Form processing logic here
history.push('/thank-you'); // Redirect to thank-you page
}
return (
<form onSubmit={handleSubmit}>
{/* form fields */}
<button type="submit">Submit</button>
</form>
);
}
Adding Navigation Links
Using NavLink
for Main Navigation:
- Implement
NavLink
for the navigation menu to allow users to identify which page they are currently viewing based on the active link styling.
NavLink
makes it easy to add styling attributes to the rendered element when it matches the current URL.
<NavLink to="/about" activeClassName="active">About</NavLink>
In this exercise, students will put into practice the foundational aspects of working with React Router in a SPA. They'll learn how to effectively manage routes, including dynamic and nested routes, and handle post-submission behaviors with programmatic navigation, all while ensuring that users can navigate easily through the use of NavLink
. This comprehensive exercise aims to solidify their understanding and skills in managing complex application architectures with React Router.
Wrap-up and Q&A
As we conclude our session on React Router and its role in building dynamic Single Page Applications (SPAs), let’s summarize the key points we've covered today and open the floor for questions.
Review and Summary
Key Features of React Router:
- Client-Side Routing: We discussed how React Router enables navigation within an application without requiring page reloads, which enhances the user experience and mimics the feel of a desktop application in a web browser.
- Dynamic Routing: We explored how to use route parameters to create dynamic paths, allowing components to fetch and display content based on URL parameters. This capability is crucial for applications like e-commerce sites or user profiles where the content changes depending on user interaction or data requirements.
- Nested Routing: The ability to nest routes within other routes was covered, which is useful for creating complex user interfaces with consistent layouts across multiple views, such as dashboards with multiple sections.
- Programmatic Navigation: We demonstrated how to navigate programmatically using the
useHistory
hook, which is essential for scenarios where navigation needs to be triggered by application logic, such as submitting a form or completing an asynchronous operation.
- Protected Routes: The concept of protected routes was introduced to ensure that certain parts of your application are accessible only to authenticated users, highlighting the integration of authentication flows within client-side routing.
Advantages of Client-Side Routing:
- Performance Improvements: Reduces the load on the server and the amount of data transferred over the network, leading to faster interactions and page transitions.
- Enhanced User Experience: Provides a smooth, seamless interaction, similar to that of a native application, by avoiding page reloads.
- Separation of Concerns: Facilitates a cleaner separation between the front-end and the back-end. The back-end can focus solely on data management via APIs, while the front-end handles user interface and experiences independently.
Q&A Session
Now, let’s transition to our Q&A session. This is your opportunity to ask questions about anything from today's material that might still be unclear or to explore further how React Router can be utilized in your specific projects. Whether you have technical queries about the implementation details, best practices in routing, or the strategic use of React Router in different types of applications, feel free to ask.
Possible Topics for Discussion Could Include:
- Best Practices: When to use hash routing versus browser routing.
- Security Considerations: How to handle security in client-side routing, especially in terms of protecting sensitive data and preventing unauthorized access.
- Performance Optimization: Techniques for optimizing performance in SPAs using React Router, such as lazy loading components.
- Real-World Applications: Discussion of real-world scenarios where complex routing has been a challenge and how React Router helped solve those issues.
This session aims to ensure you leave with a comprehensive understanding of React Router and are ready to implement sophisticated routing solutions in your projects effectively. Your questions can also help others by clarifying common doubts and encouraging deeper exploration of the topics discussed.
Դաս 20. Ուղղում React-ում React Router-ով
Հաճախորդի կողմից երթուղիների ներածություն
Ի՞նչ է հաճախորդի կողմից երթուղիչը:
Հաճախորդի կողմից երթուղղումը հիմնարար հասկացություն է ժամանակակից վեբ մշակման մեջ, հատկապես կարևոր մեկ էջի հավելվածների (SPAs) համատեքստում: Ի տարբերություն սերվերի կողմից ավանդական երթուղավորման, որտեղ յուրաքանչյուր նոր էջի հարցում սկսում է էջի ամբողջական վերաբեռնում, հաճախորդի կողմից երթուղավորումն իրականացնում է նավիգացիոն գործողությունները բրաուզերի ներսում՝ առանց էջի թարմացում պահանջելու: Այս մոտեցումը փոխում է, թե ինչպես է բովանդակությունը բեռնվում և ցուցադրվում, երբ օգտվողները շփվում են հավելվածի հետ՝ մեծապես հենվելով JavaScript-ի վրա՝ URL-ի փոփոխությունները կառավարելու և ցուցադրումը դիտելու համար:
Համեմատություն սերվերի կողմի երթուղավորման հետ.
- Սերվերի կողմի երթուղում.
- Յուրաքանչյուր երթուղու փոփոխություն նոր հարցում է ուղարկում սերվերին:
- Սերվերը մշակում է հարցումը, կատարում է անհրաժեշտ գործողություններ (օրինակ՝ տվյալների բազայի հարցումը) և հաճախորդին վերադարձնում է ամբողջությամբ ներկայացված էջը:
- Այս գործընթացը կարող է ավելի դանդաղ լինել՝ կապված շրջագայության ժամանակի հետ, հատկապես, եթե անհրաժեշտ է թարմացնել էջի միայն մի մասը։
- Հաճախորդի կողմից երթուղի.
- Հավելվածի տարբեր մասերի միջև նավարկությունը չի ներառում սերվերի հետ կապ հաստատել՝ նոր HTML բեռնելու համար:
- Փոխարենը, երթուղավորումը ներքին կարգով մշակվում է էջում բեռնված JavaScript-ի միջոցով:
- Զննարկիչը չի վերաբեռնում ամբողջ էջը, այլ դինամիկ կերպով թարմացնում է բովանդակությունը, որը պետք է փոխվի:
Դերը SPA-ներում.
Մեկ էջի հավելվածներում (SPAs) հաճախորդի կողմից ուղղորդումը առանցքային դեր է խաղում: SPA-ները բեռնում են մեկ HTML էջ և դինամիկ կերպով թարմացնում են այդ էջը, երբ օգտատերը շփվում է հավելվածի հետ: Հաճախորդի կողմի երթուղիչները JavaScript-ի շրջանակներում, ինչպիսիք են React, Angular կամ Vue.js-ը, կառավարում են այս թարմացումներն առանց լրացուցիչ էջի բեռնումների՝ դարձնելով փորձը ավելի հարթ և ավելի նման՝ աշխատասեղանի հավելվածի:
Հաճախորդի կողմից ուղղորդման առավելությունները
Ավելի արագ անցումներ.
- Քանի որ սկզբնական էջի բեռնման ընթացքում ռեսուրսները բեռնվում են միայն մեկ անգամ, և միայն տվյալները կարող են ասինխրոն կերպով բեռնվել առանց էջի թարմացման, էջերի/դիտումների միջև անցումները հիմնականում շատ ավելի արագ են:
- Նվազեցնում է ցանցի միջոցով փոխանցվող տվյալների քանակը:
Բարելավված օգտվողի փորձ.
- Ինտերֆեյսը զգում է ավելի հեղուկ և արձագանքող: Էջի վերբեռնման թարթիչներ չկան, ինչի շնորհիվ հավելվածն իրեն հարազատ հավելված է դարձնում:
- Պահպանում է օգտատիրոջ վիճակը և համատեքստը՝ առանց բարդ սերվերի կողմից մշակման անհրաժեշտության:
Frontend-ի և Backend-ի պարտականությունների տարանջատում.
- Հաճախորդի կողմից ուղղորդումը թույլ է տալիս ծրագրավորողներին տարանջատել օգտատիրոջ միջերեսի ներկայացման խնդիրները սերվերում տվյալների մշակումից և մշակումից:
- Backend-ը կարող է պարզեցվել՝ սպասարկելու API-ներ (ենթածրագրային սահմանումներ, արձանագրություններ և գործիքներ ծրագրային ապահովման և հավելվածների կառուցման համար), որոնք օգտագործում է ճակատը: Այս ճարտարապետական ​​ոճը սովորաբար հայտնի է որպես API-առաջին մոտեցում, որտեղ սերվերը տրամադրում է RESTful կամ GraphQL API-ներ:
Արդյունավետ տվյալների կառավարում.
- Քանի որ հաճախորդը ղեկավարում է UI երթուղիչը, սերվերին հիմնականում հանձնարարված է տվյալների կառավարում, ինչը կարող է հանգեցնել սերվերի ավելի արդյունավետ աշխատանքի:
- Թույլ է տալիս հաճախորդի կողմից քեշավորման ռազմավարություններ՝ նվազեցնելու նույնիսկ տվյալների առբերման պահանջները:
Ընդլայնված հնարավորություններ ժամանակակից բրաուզերների միջոցով.
- Հաճախորդի կողմից երթուղավորումն օգտագործում է ժամանակակից բրաուզերների հնարավորությունները, ինչպիսին է History API-ն, որը թույլ է տալիս մանիպուլյացիայի ենթարկել բրաուզերի աշխատաշրջանի պատմությունը, որը HTML5 հատկորոշման մաս է կազմում:
Ամփոփելով, հաճախորդի կողմից ուղղորդումը արագ և ինտերակտիվ SPA-ների կառուցման հիմնական բաղադրիչն է: Այն բարելավում է օգտատերերի փորձը՝ նվազեցնելով բեռնման ժամանակը և դարձնելով հավելվածներն ավելի անթերի: Այնուամենայնիվ, դա պահանջում է մանրակրկիտ դիտարկել երթուղային ռազմավարությունները, հնարավոր SEO ազդեցությունները և նախնական բեռնման կատարումը:
Ինչպես սկսել React Router-ով
React Router-ը ստանդարտ գրադարան է React հավելվածներում երթուղավորելու համար: Այն հնարավորություն է տալիս դինամիկ երթուղիներ իրականացնել վեբ հավելվածում, ինչը նշանակում է, որ երթուղավորումը տեղի է ունենում, երբ օգտատերը շփվում է հավելվածի հետ՝ առանց էջի վերաբեռնման: Եկեք ուսումնասիրենք, թե ինչպես կարգավորել React Router-ը ձեր նախագծում, հասկանալ դրա հիմնական բաղադրիչները և տեսնել այն գործողության մեջ:
React երթուղիչի տեղադրում
React Router-ը գալիս է երկու տեսակի՝ կախված ձեր թիրախավորված միջավայրից.
react-router-dom
վեբ հավելվածների համար.
react-router-native
React Native հավելվածների համար.
Երկու փաթեթներն էլ ունեն նմանատիպ հասկացություններ և բաղադրիչներ, բայց օպտիմիզացված են իրենց համապատասխան միջավայրերի համար:
React երթուղիչի հիմնական բաղադրիչները
1. BrowserRouter
:
- A-ն
<BrowserRouter>
օգտագործում է HTML5 պատմության API-ն (pushState, replaceState և popstate իրադարձություն)՝ ձեր միջերեսը URL-ի հետ համաժամեցված պահելու համար:
- Այն պետք է օգտագործվի որպես փաթաթում ձեր հավելվածի ամբողջ մասի շուրջ, որը պետք է վերահսկվի React Router-ի կողմից:
2. Route
:
- Բաղադրիչն
<Route>
օգտագործվում է հայտարարելու, թե ինչ պետք է ներկայացվի URL-ի ուղու հիման վրա: Դա React Router-ի հիմնական շինարարական բլոկն է:
- Յուրաքանչյուր երթուղի քարտեզագրում է ուղի դեպի բաղադրիչ:
3. Link
և NavLink
.
<Link>
բաղադրիչներն օգտագործվում են ձեր հավելվածում հղումներ ստեղծելու համար: Նրանք աշխատում են ինչպես <a>
պիտակները HTML-ում, բայց նախատեսված են React Router-ի ներծրագրային նավիգացիայի հետ աշխատելու համար:
<NavLink>
նման է, <Link>
բայց այն ներառում է ոճավորման հատկանիշներ, որոնք օգնում են ձեզ ավտոմատ կերպով ձևավորել ակտիվ հղումը: Դուք կարող եք նշել ոճերը կամ դասերը, որոնք կկիրառվեն հղման վրա, երբ այն համապատասխանում է ընթացիկ URL-ին:
4. Switch
:
- Բաղադրիչն
<Switch>
օգտագործվում է բաղադրիչները խմբավորելու <Route>
և միայն առաջինը ներկայացնելու համար, որը համապատասխանում է ընթացիկ գտնվելու վայրին: Այն օգտակար է բացառիկ երթուղիներ սահմանելու համար, որտեղ միաժամանակ պետք է ներկայացվի միայն մեկ երթուղի:
Հիմնական երթուղու կարգավորում
React երթուղիչի կարգավորումը React ծրագրում React Router-ի միջոցով ներառում է ձեր հավելվածի փաթեթավորումը <BrowserRouter>
և այնուհետև <Route>
տարբեր ուղիների բաղադրիչների սահմանում: Ահա մի պարզ օրինակ.
import React from 'react';
import { BrowserRouter, Route, Link, Switch } from 'react-router-dom';
function Home() {
return <h2>Home Page</h2>;
}
function About() {
return <h2>About Page</h2>;
}
function App() {
return (
<BrowserRouter>
<div>
<nav>
<ul>
<li>
<Link to="/">Home</Link>
</li>
<li>
<Link to="/about">About</Link>
</li>
</ul>
</nav>
{/* A <Switch> looks through its children <Route>s and
renders the first one that matches the current URL. */}
<Switch>
<Route path="/about">
<About />
</Route>
<Route path="/">
<Home />
</Route>
</Switch>
</div>
</BrowserRouter>
);
}
Այս կարգավորումներում.
- Բաղադրիչը
App
պարունակում է <BrowserRouter>
փաթաթան:
- Ներսում կա պարզ նավիգացիոն տող, որտեղ նշված են հղումները՝ օգտագործելով
<Link>
.
<Switch>
և <Route>
բաղադրիչները սահմանում են երթուղիների քարտեզագրումը դեպի բաղադրիչներ՝ ապահովելով միայն համապատասխան բաղադրիչի ցուցադրումը, երբ URL-ը համընկնում է երթուղու ուղու հետ:
Այս հիմնական ներածությունը հիմք է ստեղծում ձեր React հավելվածներում ավելի բարդ նավիգացիոն կառույցներ ստեղծելու համար՝ օգտագործելով React Router-ի տրամադրած հզոր երթուղային հնարավորությունները:
Ընդլայնված երթուղային հասկացություններ
Դինամիկ երթուղում՝ երթուղու պարամետրերով
Դինամիկ երթուղավորումը թույլ է տալիս ընդունել URL-ի տարբեր մասեր՝ որպես պարամետրեր՝ դարձնելով երթուղին ինքնին ճկուն և ընդունակ կարգավորելու տարբեր մուտքային արժեքներ: Այս տեխնիկան հատկապես օգտակար է, երբ դուք պետք է ցուցադրեք կամ աշխատեք տարբեր տվյալների վրա՝ հիմնված URL-ի պարամետրերի վրա, ինչպես օրինակ՝ ցուցադրելով տարբեր օգտվողների պրոֆիլներ կամ արտադրանքի մանրամասներ:
Դինամիկ երթուղիների սահմանում.
- Դուք դինամիկ երթուղիներ եք սահմանում React Router-ում՝ նշելով պարամետրեր բաղադրիչի ուղու հենակետում
Route
: :
Պարամետրի անվանմանը նախորդում է երկու կետ :
<Route path="/profile/:userId" component={UserProfile} />
Այս օրինակում :userId
երթուղու պարամետր է, որը կարող է հասանելի լինել UserProfile
բաղադրիչի ներսում՝ բեռնելու կոնկրետ օգտատիրոջ տվյալները:
Օրինակ Պարամետրերով. Օգտվողի պրոֆիլի էջ
Եկեք ստեղծենք օգտվողի պրոֆիլի պարզ էջ, որը վերցնում և ցուցադրում է օգտատիրոջ տվյալները՝ որպես URL պարամետր փոխանցված userId-ի հիման վրա:
Օգտվողի պրոֆիլի բաղադրիչ.
import React, { useState, useEffect } from 'react';
import { useParams } from 'react-router-dom';
function UserProfile() {
const [user, setUser] = useState(null);
const { userId } = useParams();
useEffect(() => {
fetch(`https://api.example.com/users/${userId}`)
.then(response => response.json())
.then(data => setUser(data));
}, [userId]);
return (
<div>
{user ? (
<div>
<h1>{user.name}</h1>
<p>Email: {user.email}</p>
</div>
) : (
<p>Loading...</p>
)}
</div>
);
}
Այս բաղադրիչն օգտագործում է useParams
React Router-ի կեռը՝ userId
պարամետրին մուտք գործելու համար: Այնուհետև այն բեռնում է օգտատիրոջ տվյալները API-ից՝ հիմնված այս ID-ի վրա:
Ծրագրային նավարկություն
Երբեմն, դուք պետք է կատարեք նավիգացիոն գործողություններ ծրագրային եղանակով, օրինակ՝ ձևի ներկայացումից կամ հաջող ասինխրոն գործողությունից հետո:
useHistory
Կեռիկի օգտագործումը .
- Կեռիկը
useHistory
հնարավորություն է տալիս մուտք գործել պատմության օրինակ, որը կարող եք օգտագործել նավարկելու համար:
import { useHistory } from 'react-router-dom';
function FormSubmitButton() {
let history = useHistory();
function handleSubmit() {
performAsyncOperation().then(() => {
history.push('/success'); // Navigate programmatically
});
}
return <button onClick={handleSubmit}>Submit</button>;
}
Nested Routing
Nested routing-ը թույլ է տալիս ստեղծել երթուղիների հիերարխիա, որն օգտակար է տարբեր բաղադրիչների կամ ենթաբաղադրիչների միջև հետևողական դասավորություն ունենալու համար:
Nested Routing-ի օրինակ.
<Route path="/user" component={UserLayout}>
<Route path="/user/profile" component={UserProfile} />
<Route path="/user/settings" component={UserSettings} />
</Route>
Այս կարգավորումը UserLayout
կարող է ներառել նավագոտի կամ կողագոտի, որը ընդհանուր է օգտատերերի հետ կապված բոլոր երթուղիների համար, մինչդեռ UserProfile
և UserSettings
մշակում է հատուկ դիտումներ:
Պաշտպանված երթուղիներ և նույնականացում
Պաշտպանված երթուղիները երթուղիներ են, որոնք պահանջում են օգտատիրոջ իսկությունը: React Router-ը չի ներառում ներկառուցված աջակցություն պաշտպանված երթուղիների համար, բայց դուք կարող եք հեշտությամբ իրականացնել դրանք՝ համատեղելով ձեր իսկորոշման տրամաբանությունը երթուղու մատուցման հետ:
Պաշտպանված երթուղու օրինակ.
import { Route, Redirect } from 'react-router-dom';
function ProtectedRoute({ component: Component, ...rest }) {
return (
<Route {...rest} render={
props => isAuthenticated() ? (
<Component {...props} />
) : (
<Redirect to='/login' />
)
} />
);
}
Այս օրինակում ProtectedRoute
ստուգում է, թե արդյոք օգտագործողը վավերացված է: Եթե ​​այո, ապա այն ցուցադրում է պահանջվող բաղադրիչը. եթե ոչ, այն վերահղում է օգտվողին մուտքի էջ:
Այս առաջադեմ երթուղային տեխնիկան հնարավորություն է տալիս ստեղծելու բարդ, օգտագործողի համար հարմար և անվտանգ հավելվածներ՝ օգտագործելով React Router-ը՝ բարելավելով ինչպես մշակողի, այնպես էլ օգտագործողի փորձը՝ տրամադրելով դինամիկ, պայմանական և ներկառուցված երթուղային լուծումներ:
Գործնական վարժություն - Բազմէջանոց SPA-ի կառուցում
Զորավարժությունների ակնարկ
Այս վարժության ընթացքում ուսանողները կստեղծեն փոքրիկ Single Page Application (SPA), որը ներառում է բազմաթիվ բաղադրիչներ, ինչպիսիք են գլխավոր էջը, մասին էջը, կոնտակտային ձևը և օգտվողի պրոֆիլները: Հավելվածի յուրաքանչյուր մաս հասանելի կլինի տարբեր երթուղիներով՝ ցույց տալով հաճախորդի կողմից երթուղիների ուժն ու ճկունությունը React Router-ով:
Վարժության նպատակները.
- Ծանոթացեք React Router-ին. Հասկացեք, թե ինչպես կարգավորել և կառավարել երթուղիները՝ օգտագործելով React Router-ը:
- Իրականացնել դինամիկ և ներկառուցված երթուղում. օգտագործեք դինամիկ երթուղիներ օգտատերերի պրոֆիլների համար և ներկառուցված երթուղիներ՝ կապված դիտումները կազմակերպելու համար:
- Օգտագործեք ծրագրային նավարկություն. կարգավորեք վերահղումը իրադարձություններից հետո, ինչպիսիք են ձևաթղթերի ներկայացումները:
Իրականացման առանձնահատկությունները
1. Կարգավորեք հիմնական երթուղին.
- Նախ, համոզվեք, որ հավելվածն ունի անհրաժեշտ էջեր՝ Գլխավոր, Մասին, Կոնտակտ և Օգտատիրոջ պրոֆիլ:
- Տեղադրեք React Router-ը հավելվածում՝ փաթեթավորելով ամբողջ հավելվածը մի
<BrowserRouter>
.
Օրինակ:
import React from 'react';
import { BrowserRouter as Router, Route, Switch, NavLink } from 'react-router-dom';
import Home from './Home';
import About from './About';
import Contact from './Contact';
import UserProfile from './UserProfile';
function App() {
return (
<Router>
<div>
<nav>
<ul>
<li><NavLink exact to="/" activeClassName="active">Home</NavLink></li>
<li><NavLink to="/about" activeClassName="active">About</NavLink></li>
<li><NavLink to="/contact" activeClassName="active">Contact</NavLink></li>
</ul>
</nav>
<Switch>
<Route path="/" exact component={Home} />
<Route path="/about" component={About} />
<Route path="/contact" component={Contact} />
<Route path="/user/:userId" component={UserProfile} />
</Switch>
</div>
</Router>
);
}
2. Դինամիկ երթուղի օգտատերերի պրոֆիլների համար.
- Իրականացրեք դինամիկ երթուղում՝ օգտատերերի պրոֆիլները մշակելու համար, որտեղ օգտատիրոջ ID-ն վերցված է URL-ից:
- Սա թույլ է տալիս
UserProfile
բաղադրիչին առբերել և ցուցադրել տվյալներ՝ հիմնված տրամադրված ID-ի վրա:
3. Nested Routing:
- Օգտագործեք Nested Routing-ը About բաժնում, եթե այն ունի բազմաթիվ ենթաբաժիններ, ինչպիսիք են ընկերության պատմությունը, թիմը և այլն:
- Այս մոտեցումը օգնում է կազմակերպել բարդ կառույցներ մեկ երթուղու շրջանակներում՝ պահպանելով մաքուր և կառավարելի ծածկագրի կառուցվածքը:
Nested Routing-ի օրինակ.
<Route path="/about" component={About}>
<Route path="/about/history" component={History} />
<Route path="/about/team" component={Team} />
</Route>
4. Ծրագրային նավարկություն ձևի ներկայացումից հետո.
- Կոնտակտային ձևում օգտագործեք
useHistory
React Router-ի կեռը՝ ծրագրային կերպով նավարկելու շնորհակալական էջ կամ վերադառնալու գլխավոր էջ՝ ձևը ներկայացնելուց հետո:
Օրինակ:
import { useHistory } from 'react-router-dom';
function ContactForm() {
let history = useHistory();
function handleSubmit(event) {
event.preventDefault();
// Form processing logic here
history.push('/thank-you'); // Redirect to thank-you page
}
return (
<form onSubmit={handleSubmit}>
{/* form fields */}
<button type="submit">Submit</button>
</form>
);
}
Նավիգացիոն հղումների ավելացում
Օգտագործելով NavLink
հիմնական նավիգացիայի համար.
- Կիրառել
NavLink
նավիգացիոն մենյուի համար, որպեսզի օգտվողները կարողանան պարզել, թե որ էջն են նրանք ներկայումս դիտում` հիմնվելով ակտիվ հղման ձևավորման վրա:
NavLink
հեշտացնում է ոճավորման ատրիբուտներ ավելացնել ցուցադրված տարրին, երբ այն համապատասխանում է ընթացիկ URL-ին:
<NavLink to="/about" activeClassName="active">About</NavLink>
Այս վարժությունում ուսանողները գործնականում կկիրառեն React Router-ի հետ աշխատելու հիմնարար ասպեկտները SPA-ում: Նրանք կսովորեն, թե ինչպես արդյունավետ կառավարել երթուղիները, ներառյալ դինամիկ և ներկառուցված երթուղիները, ինչպես նաև կարգավորել ծրագրային նավարկմամբ վարքագիծը ներկայացնելուց հետո՝ միաժամանակ ապահովելով, որ օգտվողները կարող են հեշտությամբ նավարկվել NavLink
. Այս համապարփակ վարժությունը նպատակ ունի ամրապնդել նրանց հասկացողությունն ու հմտությունները React Router-ով բարդ հավելվածների ճարտարապետության կառավարման գործում:
Ամփոփում և հարց ու պատասխան
Երբ մենք ավարտում ենք մեր նիստը React Router-ի և դրա դերի վերաբերյալ դինամիկ Single Page Applications (SPAs) կառուցման գործում, եկեք ամփոփենք այն հիմնական կետերը, որոնք մենք անդրադարձել ենք այսօր և բացենք հարցերի համար:
Վերանայում և ամփոփում
React Router-ի հիմնական առանձնահատկությունները.
- Հաճախորդի կողմից երթուղղում. մենք քննարկեցինք, թե ինչպես է React Router-ը հնարավորություն տալիս նավիգացիան հավելվածի ներսում՝ առանց էջի վերաբեռնում պահանջելու, ինչը բարելավում է օգտատիրոջ փորձը և ընդօրինակում է աշխատասեղանի հավելվածի զգացողությունը վեբ բրաուզերում:
- Դինամիկ երթուղիավորում. մենք ուսումնասիրեցինք, թե ինչպես օգտագործել երթուղու պարամետրերը դինամիկ ուղիներ ստեղծելու համար՝ թույլ տալով բաղադրիչներին բեռնել և ցուցադրել բովանդակությունը՝ հիմնված URL-ի պարամետրերի վրա: Այս հնարավորությունը շատ կարևոր է այնպիսի ծրագրերի համար, ինչպիսիք են էլեկտրոնային առևտրի կայքերը կամ օգտվողների պրոֆիլները, որտեղ բովանդակությունը փոխվում է՝ կախված օգտագործողի փոխազդեցությունից կամ տվյալների պահանջներից:
- Ներդրված երթուղիավորում. լուսաբանվել է այլ երթուղիներում երթուղիներ տեղադրելու հնարավորությունը, որն օգտակար է օգտատերերի բարդ միջերեսներ ստեղծելու համար՝ հետևողական դասավորություններով մի քանի դիտումներով, ինչպիսիք են բազմաթիվ բաժիններով վահանակները:
- Ծրագրային նավարկություն. մենք ցույց տվեցինք, թե ինչպես կարելի է նավարկել ծրագրային կերպով՝ օգտագործելով
useHistory
կեռիկը, ինչը կարևոր է այն սցենարների համար, որտեղ նավիգացիան պետք է գործարկվի կիրառական տրամաբանությամբ, օրինակ՝ ձևաթուղթ ներկայացնելը կամ ասինխրոն գործողություն լրացնելը:
- Պաշտպանված երթուղիներ. Պաշտպանված երթուղիների հայեցակարգը ներդրվել է ապահովելու համար, որ ձեր հավելվածի որոշ մասեր հասանելի են միայն վավերացված օգտատերերի համար՝ ընդգծելով նույնականացման հոսքերի ինտեգրումը հաճախորդի կողմից երթուղղման շրջանակներում:
Հաճախորդի կողմից ուղղորդման առավելությունները.
- Կատարողականի բարելավում. նվազեցնում է սերվերի բեռը և ցանցով փոխանցվող տվյալների քանակը՝ հանգեցնելով ավելի արագ փոխազդեցությունների և էջի անցումների:
- Օգտատիրոջ ընդլայնված փորձառություն. Ապահովում է հարթ, անխափան փոխազդեցություն, որը նման է բնօրինակ հավելվածին, խուսափելով էջի վերաբեռնումից:
- Մտահոգությունների տարանջատում. հեշտացնում է ավելի մաքուր տարանջատումը առջևի և հետևի մասի միջև: Back-end-ը կարող է կենտրոնանալ բացառապես տվյալների կառավարման վրա API-ների միջոցով, մինչդեռ առջևի վերջը ինքնուրույն կարգավորում է օգտատիրոջ միջերեսը և փորձառությունները:
Հարց ու պատասխան նիստ
Այժմ, եկեք անցնենք մեր հարցուպատասխանի նիստին: Սա ձեր հնարավորությունն է հարցեր տալու այսօրվա նյութից որևէ բանի մասին, որը կարող է դեռևս անհասկանալի լինել կամ հետագայում ուսումնասիրել, թե ինչպես կարող է React Router-ը օգտագործվել ձեր կոնկրետ նախագծերում: Անկախ նրանից, թե դուք տեխնիկական հարցումներ ունեք իրականացման մանրամասների, երթուղավորման լավագույն փորձի կամ React Router-ի ռազմավարական օգտագործման վերաբերյալ տարբեր տեսակի հավելվածներում, ազատ զգալ հարցրեք:
Քննարկման հնարավոր թեմաները կարող են ներառել.
- Լավագույն փորձ .
- Անվտանգության նկատառումներ. Ինչպե՞ս կարգավորել անվտանգությունը հաճախորդի կողմից երթուղղման ժամանակ, հատկապես զգայուն տվյալների պաշտպանության և չարտոնված մուտքը կանխելու առումով:
- Արդյունավետության օպտիմիզացում. SPA-ներում կատարողականի օպտիմալացման տեխնիկա՝ օգտագործելով React Router-ը, օրինակ՝ ծույլ բեռնման բաղադրիչները:
- Իրական աշխարհի հավելվածներ. Իրական աշխարհի սցենարների քննարկում, որտեղ բարդ երթուղավորումը մարտահրավեր է եղել, և թե ինչպես է React Router-ը օգնել լուծել այդ խնդիրները:
Այս նիստը նպատակ ունի ապահովելու, որ դուք հեռանաք React Router-ի համապարփակ ըմբռնմամբ և պատրաստ եք արդյունավետորեն կիրառել երթուղային լուծումներ ձեր նախագծերում: Ձեր հարցերը կարող են նաև օգնել ուրիշներին՝ պարզաբանելով ընդհանուր կասկածները և խրախուսելով ավելի խորը ուսումնասիրել քննարկված թեմաները:
Урок 20: Маршрутизация в React с помощью React Router
Введение в маршрутизацию на стороне клиента
Что такое маршрутизация на стороне клиента?
Маршрутизация на стороне клиента — это фундаментальная концепция современной веб-разработки, особенно актуальная в контексте одностраничных приложений (SPA). В отличие от традиционной маршрутизации на стороне сервера, где каждый новый запрос страницы инициирует полную перезагрузку страницы, маршрутизация на стороне клиента обрабатывает навигационные действия в браузере, не требуя обновления страницы. Этот подход меняет способ загрузки и отображения контента, когда пользователи взаимодействуют с приложением, в значительной степени полагаясь на JavaScript для управления изменениями URL-адресов и просмотра рендеринга.
Сравнение с маршрутизацией на стороне сервера:
- Маршрутизация на стороне сервера:
- При каждом изменении маршрута на сервер отправляется новый запрос.
- Сервер обрабатывает запрос, выполняет необходимые операции (например, запрос к базе данных) и возвращает клиенту полностью обработанную страницу.
- Этот процесс может быть медленнее из-за времени прохождения туда и обратно, особенно если необходимо обновить только часть страницы.
- Маршрутизация на стороне клиента:
- Навигация между различными частями приложения не требует обращения к серверу для получения нового HTML.
- Вместо этого маршрутизация обрабатывается внутри JavaScript, загруженного на страницу.
- Браузер не перезагружает всю страницу, а динамически обновляет контент, который необходимо изменить.
Роль в SPA.
В одностраничных приложениях (SPA) маршрутизация на стороне клиента играет ключевую роль. SPA загружают одну HTML-страницу и динамически обновляют эту страницу по мере взаимодействия пользователя с приложением. Маршрутизаторы на стороне клиента в средах JavaScript, таких как React, Angular или Vue.js, управляют этими обновлениями без дополнительной загрузки страниц, что делает работу более плавной и более похожей на настольное приложение.
Преимущества маршрутизации на стороне клиента
Более быстрые переходы:
- Поскольку ресурсы загружаются только один раз во время начальной загрузки страницы, а асинхронно могут быть получены только данные без обновления страницы, переходы между страницами/представлениями обычно происходят намного быстрее.
- Уменьшает объем данных, передаваемых по сети.
Улучшенный пользовательский опыт:
- Интерфейс кажется более плавным и отзывчивым. При перезагрузке страницы не мигает, что делает приложение похожим на родное.
- Поддерживает состояние и контекст пользователя без необходимости сложной обработки на стороне сервера.
Разделение обязанностей фронтенда и бэкенда:
- Маршрутизация на стороне клиента позволяет разработчикам отделить проблемы представления пользовательского интерфейса от обработки и обработки данных на сервере.
- Серверную часть можно упростить для обслуживания API (набора определений подпрограмм, протоколов и инструментов для создания программного обеспечения и приложений), которые использует внешний интерфейс. Этот архитектурный стиль широко известен как подход «сначала API», при котором сервер предоставляет API-интерфейсы RESTful или GraphQL.
Эффективное управление данными:
- Поскольку клиент обрабатывает маршрутизацию пользовательского интерфейса, перед сервером в первую очередь стоит задача управления данными, что может привести к более эффективной производительности сервера.
- Позволяет использовать стратегии кэширования на стороне клиента, чтобы даже снизить требования к выборке данных.
Расширенные возможности современных браузеров:
- Маршрутизация на стороне клиента использует возможности современных браузеров, такие как History API, который позволяет манипулировать историей сеансов браузера, которая является частью спецификации HTML5.
Таким образом, маршрутизация на стороне клиента является ключевым компонентом создания быстрых и интерактивных SPA. Это улучшает взаимодействие с пользователем, сокращая время загрузки и делая приложения более плавными. Однако это требует тщательного рассмотрения стратегий маршрутизации, потенциального воздействия на SEO и начальной производительности загрузки.
Начало работы с React Router
React Router — это стандартная библиотека для маршрутизации в приложениях React. Он позволяет реализовать динамическую маршрутизацию в веб-приложении, что означает, что маршрутизация происходит по мере взаимодействия пользователя с приложением без перезагрузки страницы. Давайте углубимся в то, как настроить React Router в вашем проекте, разберемся с его основными компонентами и увидим его в действии.
Установка React Router
React Router поставляется в двух вариантах в зависимости от целевой среды:
react-router-dom
для веб-приложений:
react-router-native
для приложений React Native:
Оба пакета имеют схожие концепции и компоненты, но оптимизированы для соответствующих сред.
Основные компоненты React Router
1. BrowserRouter
:
- A
<BrowserRouter>
использует API истории HTML5 (pushState, replaceState и событие popstate), чтобы синхронизировать ваш пользовательский интерфейс с URL-адресом.
- Его следует использовать в качестве оболочки для всей части вашего приложения, которой должен управлять React Router.
2. Route
:
- Компонент
<Route>
используется для объявления того, что должно отображаться на основе URL-пути. Это основной строительный блок React Router.
- Каждый маршрут отображает путь к компоненту.
3. Link
и NavLink
:
<Link>
компоненты используются для создания ссылок в вашем приложении. Они работают как <a>
теги в HTML, но предназначены для работы с навигацией внутри приложения React Router.
<NavLink>
похож на <Link>
, но включает атрибуты стиля, которые помогают автоматически стилизовать активную ссылку. Вы можете указать стили или классы, которые будут применяться к ссылке, если она соответствует текущему URL-адресу.
4. Switch
:
- Компонент
<Switch>
используется для группировки <Route>
компонентов и рендеринга только первого из них, который соответствует текущему местоположению. Это полезно для определения эксклюзивных маршрутов, где одновременно должен отображаться только один маршрут.
Настройка базового маршрута
Настройка маршрутизации в приложении React с помощью React Router включает в себя упаковку вашего приложения в <BrowserRouter>
и последующее определение <Route>
компонентов для разных путей. Вот простой пример:
import React from 'react';
import { BrowserRouter, Route, Link, Switch } from 'react-router-dom';
function Home() {
return <h2>Home Page</h2>;
}
function About() {
return <h2>About Page</h2>;
}
function App() {
return (
<BrowserRouter>
<div>
<nav>
<ul>
<li>
<Link to="/">Home</Link>
</li>
<li>
<Link to="/about">About</Link>
</li>
</ul>
</nav>
{/* A <Switch> looks through its children <Route>s and
renders the first one that matches the current URL. */}
<Switch>
<Route path="/about">
<About />
</Route>
<Route path="/">
<Home />
</Route>
</Switch>
</div>
</BrowserRouter>
);
}
В этой настройке:
- Компонент
App
содержит <BrowserRouter>
обертку.
- Внутри есть простая панель навигации со ссылками, определенными с помощью
<Link>
.
<Switch>
и <Route>
компоненты определяют сопоставление путей к компонентам, обеспечивая отображение только соответствующего компонента, когда URL-адрес соответствует пути маршрута.
Это базовое введение закладывает основу для создания более сложных навигационных структур в ваших приложениях React, используя мощные возможности маршрутизации, предоставляемые React Router.
Расширенные концепции маршрутизации
Динамическая маршрутизация с параметрами маршрута
Динамическая маршрутизация позволяет принимать различные части URL-адреса в качестве параметров, что делает сам маршрут гибким и способным обрабатывать различные входные значения. Этот метод особенно полезен, когда вам нужно отображать или обрабатывать различные данные на основе параметров URL-адреса, например отображать разные профили пользователей или сведения о продукте.
Определение динамических маршрутов:
- Вы определяете динамические маршруты в React Router, указывая параметры в свойстве пути компонента
Route
. Двоеточие :
предшествует имени параметра.
<Route path="/profile/:userId" component={UserProfile} />
В этом примере :userId
— это параметр маршрута, к которому можно получить доступ внутри UserProfile
компонента для загрузки определенных пользовательских данных.
Пример с параметрами: страница профиля пользователя
Давайте создадим простую страницу профиля пользователя, которая извлекает и отображает данные пользователя на основе идентификатора пользователя, переданного в качестве параметра URL-адреса.
Компонент UserProfile:
import React, { useState, useEffect } from 'react';
import { useParams } from 'react-router-dom';
function UserProfile() {
const [user, setUser] = useState(null);
const { userId } = useParams();
useEffect(() => {
fetch(`https://api.example.com/users/${userId}`)
.then(response => response.json())
.then(data => setUser(data));
}, [userId]);
return (
<div>
{user ? (
<div>
<h1>{user.name}</h1>
<p>Email: {user.email}</p>
</div>
) : (
<p>Loading...</p>
)}
</div>
);
}
Этот компонент использует useParams
перехватчик из React Router для доступа к userId
параметру. Затем он извлекает пользовательские данные из API на основе этого идентификатора.
Программная навигация
Иногда вам необходимо выполнить действия навигации программно, например после отправки формы или успешной асинхронной операции.
Использование useHistory
крючка:
- Хук
useHistory
дает вам доступ к экземпляру истории, который вы можете использовать для навигации.
import { useHistory } from 'react-router-dom';
function FormSubmitButton() {
let history = useHistory();
function handleSubmit() {
performAsyncOperation().then(() => {
history.push('/success'); // Navigate programmatically
});
}
return <button onClick={handleSubmit}>Submit</button>;
}
Вложенная маршрутизация
Вложенная маршрутизация позволяет создавать иерархию маршрутов, что полезно для обеспечения единообразной компоновки различных компонентов или подкомпонентов.
Пример вложенной маршрутизации:
<Route path="/user" component={UserLayout}>
<Route path="/user/profile" component={UserProfile} />
<Route path="/user/settings" component={UserSettings} />
</Route>
В этой настройке UserLayout
можно включить панель навигации или боковую панель, общую для всех маршрутов, связанных с пользователем, а UserProfile
также UserSettings
обрабатывать определенные представления.
Защищенные маршруты и аутентификация
Защищенные маршруты — это маршруты, требующие аутентификации пользователя. React Router не включает встроенную поддержку защищенных маршрутов, но вы можете легко реализовать их, объединив логику аутентификации с рендерингом маршрутов.
Пример защищенного маршрута:
import { Route, Redirect } from 'react-router-dom';
function ProtectedRoute({ component: Component, ...rest }) {
return (
<Route {...rest} render={
props => isAuthenticated() ? (
<Component {...props} />
) : (
<Redirect to='/login' />
)
} />
);
}
В этом примере ProtectedRoute
проверяется, прошел ли пользователь аутентификацию. Если да, он отображает запрошенный компонент; в противном случае он перенаправляет пользователя на страницу входа.
Эти передовые методы маршрутизации позволяют создавать сложные, удобные и безопасные приложения с помощью React Router, улучшая работу как разработчиков, так и пользователей за счет предоставления решений динамической, условной и вложенной маршрутизации.
Практическое упражнение — создание многостраничного SPA
Обзор упражнений
В этом упражнении учащиеся создадут небольшое одностраничное приложение (SPA), которое включает в себя несколько компонентов, таких как домашняя страница, страница «О нас», контактная форма и профили пользователей. Доступ к каждой части приложения будет осуществляться по отдельным маршрутам, что демонстрирует мощь и гибкость маршрутизации на стороне клиента с помощью React Router.
Цели упражнения:
- Ознакомьтесь с React Router: поймите, как настраивать маршруты и управлять ими с помощью React Router.
- Реализация динамической и вложенной маршрутизации. Используйте динамическую маршрутизацию для профилей пользователей и вложенные маршруты для организации связанных представлений.
- Используйте программную навигацию: обрабатывайте перенаправление после таких событий, как отправка формы.
Реализация функций
1. Настройка базовой маршрутизации:
- Сначала убедитесь, что в приложении есть необходимые страницы: «Главная», «О программе», «Контакты» и «Профиль пользователя».
- Настройте React Router в приложении, обернув все приложение в файл
<BrowserRouter>
.
Пример:
import React from 'react';
import { BrowserRouter as Router, Route, Switch, NavLink } from 'react-router-dom';
import Home from './Home';
import About from './About';
import Contact from './Contact';
import UserProfile from './UserProfile';
function App() {
return (
<Router>
<div>
<nav>
<ul>
<li><NavLink exact to="/" activeClassName="active">Home</NavLink></li>
<li><NavLink to="/about" activeClassName="active">About</NavLink></li>
<li><NavLink to="/contact" activeClassName="active">Contact</NavLink></li>
</ul>
</nav>
<Switch>
<Route path="/" exact component={Home} />
<Route path="/about" component={About} />
<Route path="/contact" component={Contact} />
<Route path="/user/:userId" component={UserProfile} />
</Switch>
</div>
</Router>
);
}
2. Динамическая маршрутизация для профилей пользователей:
- Внедрите динамическую маршрутизацию для обработки профилей пользователей, где идентификатор пользователя считывается из URL-адреса.
- Это позволяет
UserProfile
компоненту получать и отображать данные на основе предоставленного идентификатора.
3. Вложенная маршрутизация:
- Используйте вложенную маршрутизацию в разделе «О программе», если он имеет несколько подразделов, например историю компании, команду и т. д.
- Этот подход помогает организовывать сложные структуры в рамках одного маршрута, сохраняя чистую и управляемую структуру кода.
Пример вложенной маршрутизации:
<Route path="/about" component={About}>
<Route path="/about/history" component={History} />
<Route path="/about/team" component={Team} />
</Route>
4. Программная навигация после отправки формы:
- В контактной форме используйте
useHistory
перехватчик из React Router для программного перехода на страницу благодарности или обратно на домашнюю страницу после отправки формы.
Пример:
import { useHistory } from 'react-router-dom';
function ContactForm() {
let history = useHistory();
function handleSubmit(event) {
event.preventDefault();
// Form processing logic here
history.push('/thank-you'); // Redirect to thank-you page
}
return (
<form onSubmit={handleSubmit}>
{/* form fields */}
<button type="submit">Submit</button>
</form>
);
}
Добавление навигационных ссылок
Использование NavLink
для основной навигации:
- Реализуйте
NavLink
меню навигации, чтобы пользователи могли определять, какую страницу они просматривают в данный момент, на основе стиля активной ссылки.
NavLink
позволяет легко добавлять атрибуты стиля к отображаемому элементу, если он соответствует текущему URL-адресу.
<NavLink to="/about" activeClassName="active">About</NavLink>
В этом упражнении студенты примут на практике основные аспекты работы с React Router в SPA. Они научатся эффективно управлять маршрутами, включая динамические и вложенные маршруты, а также управлять поведением после отправки с помощью программной навигации, при этом гарантируя, что пользователи смогут легко перемещаться с помощью NavLink
. Это комплексное упражнение направлено на закрепление их понимания и навыков управления сложными архитектурами приложений с помощью React Router.
Подведение итогов и вопросы и ответы
Завершая нашу сессию о React Router и его роли в создании динамических одностраничных приложений (SPA), давайте подведем итог ключевым моментам, которые мы рассмотрели сегодня, и предоставим слово для вопросов.
Обзор и резюме
Ключевые особенности React Router:
- Маршрутизация на стороне клиента. Мы обсудили, как React Router обеспечивает навигацию внутри приложения без необходимости перезагрузки страниц, что улучшает взаимодействие с пользователем и имитирует ощущения от настольного приложения в веб-браузере.
- Динамическая маршрутизация. Мы рассмотрели, как использовать параметры маршрута для создания динамических путей, позволяющих компонентам получать и отображать контент на основе параметров URL-адреса. Эта возможность имеет решающее значение для таких приложений, как сайты электронной коммерции или профили пользователей, где контент меняется в зависимости от взаимодействия с пользователем или требований к данным.
- Вложенная маршрутизация. Была рассмотрена возможность вложения маршрутов в другие маршруты, что полезно для создания сложных пользовательских интерфейсов с согласованным макетом в нескольких представлениях, например информационных панелей с несколькими разделами.
- Программная навигация. Мы продемонстрировали, как программно перемещаться с помощью перехватчика
useHistory
, что важно для сценариев, в которых навигация должна запускаться логикой приложения, например при отправке формы или выполнении асинхронной операции.
- Защищенные маршруты. Концепция защищенных маршрутов была введена для обеспечения того, чтобы определенные части вашего приложения были доступны только аутентифицированным пользователям, что подчеркивает интеграцию потоков аутентификации в маршрутизацию на стороне клиента.
Преимущества маршрутизации на стороне клиента:
- Улучшения производительности: снижается нагрузка на сервер и объем данных, передаваемых по сети, что приводит к более быстрому взаимодействию и переходу между страницами.
- Улучшенный пользовательский интерфейс: обеспечивает плавное и плавное взаимодействие, аналогичное встроенному приложению, без перезагрузки страниц.
- Разделение задач: способствует более четкому разделению между интерфейсом и сервером. Серверная часть может сосредоточиться исключительно на управлении данными через API, в то время как интерфейсная часть обрабатывает пользовательский интерфейс и взаимодействие независимо.
Сессия вопросов и ответов
Теперь давайте перейдем к сеансу вопросов и ответов. Это ваша возможность задать вопросы о чем-либо из сегодняшнего материала, который может быть еще неясен, или дополнительно изучить, как React Router можно использовать в ваших конкретных проектах. Если у вас есть технические вопросы о деталях реализации, лучших методах маршрутизации или стратегическом использовании React Router в различных типах приложений, не стесняйтесь спрашивать.
Возможные темы для обсуждения могут включать:
- Рекомендации: когда использовать хеш-маршрутизацию, а не маршрутизацию через браузер.
- Вопросы безопасности: как обеспечить безопасность маршрутизации на стороне клиента, особенно с точки зрения защиты конфиденциальных данных и предотвращения несанкционированного доступа.
- Оптимизация производительности: методы оптимизации производительности в SPA с использованием React Router, такие как отложенная загрузка компонентов.
- Реальные приложения: обсуждение реальных сценариев, в которых сложная маршрутизация была проблемой, и того, как React Router помог решить эти проблемы.
Целью этого занятия является обеспечение того, чтобы вы получили полное представление о React Router и были готовы эффективно внедрять сложные решения маршрутизации в своих проектах. Ваши вопросы также могут помочь другим, проясняя общие сомнения и побуждая к более глубокому изучению обсуждаемых тем.