19 从零到上手学习 React 框架 - 页面导航与路由守卫

19 从零到上手学习 React 框架 - 页面导航与路由守卫

在本小节中,我们将学习如何使用 React Router 实现页面导航和路由守卫。React Router 是 React 官方推荐的路由解决方案,能够帮助我们在单页面应用中实现页面之间的跳转。

1. 安装 React Router

首先,我们需要安装 react-router-dom 包。可以使用以下命令进行安装:

1
npm install react-router-dom

2. 基本的页面导航

2.1 创建基础组件

我们先创建几个组件作为不同的页面。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// Home.js
import React from 'react';

const Home = () => {
return <h1>首页</h1>;
};

export default Home;

// About.js
import React from 'react';

const About = () => {
return <h1>关于我们</h1>;
};

export default About;

// NotFound.js
import React from 'react';

const NotFound = () => {
return <h1>404 - 页面未找到</h1>;
};

export default NotFound;

2.2 设置路由

接下来,在 App.js 文件中,设置路由和导航。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// App.js
import React from 'react';
import { BrowserRouter as Router, Route, Switch, Link } from 'react-router-dom';
import Home from './Home';
import About from './About';
import NotFound from './NotFound';

const App = () => {
return (
<Router>
<nav>
<ul>
<li>
<Link to="/">首页</Link>
</li>
<li>
<Link to="/about">关于我们</Link>
</li>
</ul>
</nav>

<Switch>
<Route path="/" exact component={Home} />
<Route path="/about" component={About} />
<Route component={NotFound} />
</Switch>
</Router>
);
};

export default App;

2.3 运行应用

确保你已经启动了开发服务器,运行你的 React 应用,你应该能够在浏览器中访问不同的页面了。

3. 添加路由守卫

路由守卫可以根据条件决定用户是否可以访问某个路由。在这里我们使用一个简单的例子,展示如何实现路由守卫。

3.1 创建一个登录状态

假设我们有一个简单的登录状态,我们需要在尝试访问 About 页面之前检查用户是否已登录。

1
2
3
4
5
6
7
8
9
10
11
12
// auth.js
export const isAuthenticated = () => {
return localStorage.getItem('isAuthenticated') === 'true';
};

export const login = () => {
localStorage.setItem('isAuthenticated', 'true');
};

export const logout = () => {
localStorage.removeItem('isAuthenticated');
};

3.2 创建路由守卫组件

我们创建一个 PrivateRoute 组件,用于保护某个路由。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// PrivateRoute.js
import React from 'react';
import { Route, Redirect } from 'react-router-dom';
import { isAuthenticated } from './auth';

const PrivateRoute = ({ component: Component, ...rest }) => {
return (
<Route
{...rest}
render={props =>
isAuthenticated() ? (
<Component {...props} />
) : (
<Redirect to="/" />
)
}
/>
);
};

export default PrivateRoute;

3.3 使用路由守卫

接下来,编辑 App.js 使用 PrivateRoute

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// App.js
import PrivateRoute from './PrivateRoute';

// ....

const App = () => {
return (
<Router>
<nav>
<ul>
<li>
<Link to="/">首页</Link>
</li>
<li>
<Link to="/about">关于我们</Link>
</li>
<li>
<button onClick={login}>登录</button>
<button onClick={logout}>注销</button>
</li>
</ul>
</nav>

<Switch>
<Route path="/" exact component={Home} />
<PrivateRoute path="/about" component={About} />
<Route component={NotFound} />
</Switch>
</Router>
);
};

通过上述更改,只有在用户登录后才能访问 /about 页面,否则会重定向到首页。

结论

在这一小节中,我们学习了如何使用 React Router 实现页面导航和基本的路由守卫。通过简单的逻辑,我们可以控制用户的访问权限,从而保护应用中的敏感页面。

接下来的学习可以扩展到更复杂的路由机制,如嵌套路由、动态路由等,以增强应用的灵活性和功能性。

动态加载与懒加载路由

动态加载与懒加载路由

在构建大型应用时,优化应用的加载速度是非常重要的。React提供了懒加载(Lazy Loading)功能,可以帮助我们动态加载路由组件,以减少初始加载时间。这一小节将详细介绍如何在React中实现动态加载与懒加载路由。

1. 动态加载与懒加载的概念

  • 动态加载:表示在运行时加载模块或组件,而不是在应用启动时就加载全部的代码。这可以提高应用的性能。

  • 懒加载:通常指的是将组件的加载延迟到真正需要时。React通过React.lazySuspense来实现懒加载。

2. 使用 React.lazySuspense

2.1 安装 React Router

首先,确保你的项目中已经安装了react-router-dom。如果没有,可以使用以下命令进行安装:

1
npm install react-router-dom

2.2 创建懒加载组件

接下来,我们需要创建一个需要懒加载的组件。例如,创建一个简单的About组件:

1
2
3
4
5
6
7
8
// About.js
import React from 'react';

const About = () => {
return <h1>About Page</h1>;
};

export default About;

2.3 使用 React.lazy

在你的路由配置中,使用React.lazy来动态加载About组件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// App.js
import React, { Suspense, lazy } from 'react';
import { BrowserRouter as Router, Route, Switch, Link } from 'react-router-dom';

const About = lazy(() => import('./About'));

const App = () => {
return (
<Router>
<nav>
<ul>
<li>
<Link to="/">Home</Link>
</li>
<li>
<Link to="/about">About</Link>
</li>
</ul>
</nav>
<Suspense fallback={<div>Loading...</div>}>
<Switch>
<Route path="/about" component={About} />
<Route path="/" exact>
<h1>Home Page</h1>
</Route>
</Switch>
</Suspense>
</Router>
);
};

export default App;

2.4 解释代码

  1. **const About = lazy(() => import('./About'));**:这行代码使用React.lazy来动态加载About组件。当路由匹配到/about时,组件会被加载。

  2. **<Suspense fallback={<div>Loading...</div>}>**:使用Suspense包裹懒加载的组件,fallback属性定义了在组件加载时渲染的内容。在此例中,当About组件正在加载时,页面会显示Loading...

  3. **<Switch><Route>**:使用SwitchRoute来定义路由。Switch会根据匹配指定路径的Route来渲染对应的组件。

3. 实现更多懒加载

你可以为项目中的其他组件采用相同的方法进行懒加载。例如,创建更多的页面组件(如ContactServices),然后在你的路由中使用React.lazy来动态加载它们。

示例:添加 Contact 组件

1
2
3
4
5
6
7
8
// Contact.js
import React from 'react';

const Contact = () => {
return <h1>Contact Page</h1>;
};

export default Contact;

App.js中为Contact添加路由:

1
2
3
4
const Contact = lazy(() => import('./Contact'));

// 在 <Switch> 中增加 Contact 路由
<Route path="/contact" component={Contact} />

4. 总结

在本小节中,我们学习了如何在React中实现动态加载与懒加载路由。通过使用React.lazySuspense,我们可以按需加载组件,改善应用性能。这样的策略尤其适合大型应用,可以有效缩短初始加载时间,提高用户体验。

接下来,你可以继续探索React中的状态管理、上下文API等更多高级主题,从而构建更复杂的应用。

21 从零到上手学习 React 框架教程

21 从零到上手学习 React 框架教程

项目需求分析与设计

在学习 React 框架之前,首先需要进行需求分析设计阶段。这一阶段是确保我们的项目能够顺利进行的基础。以下是对项目需求的详细分析与设计的几个关键部分。

1. 项目背景

在现代网页开发中,单页面应用(SPA)越来越普遍。React 是一个用于构建用户界面的 JavaScript 库,适合于构建复杂的 UI。我们的目标是搭建一个简单的任务管理应用,用户可以在其中添加、查看和删除任务。

2. 功能需求

在进行需求分析时,我们需要明确项目的功能模块。以下是我们任务管理应用的主要功能需求:

  • 用户界面

    • 显示当前任务列表
    • 提供输入框以添加新任务
    • 列表项允许用户标记任务为已完成或未完成
    • 用户可以删除已完成的任务
  • 状态管理

    • 任务列表的状态需要能够在 React 组件中进行管理
    • 可以使用 React 的 useStateuseEffect Hook 来处理状态和生命周期

3. 非功能需求

除了功能需求外,还有一些非功能需求需要考虑:

  • 性能:应用应能在合理的时间内响应用户操作,避免因任务数据量增大而造成的性能下降。
  • 可维护性:应用代码需遵循组件化设计原则,便于后期的维护与扩展。

4. 技术选型

在项目设计过程中,选择合适的技术栈非常重要。我们的项目选择了以下技术:

  • 前端框架:React
  • 状态管理:使用 React 自带的 useStateuseReducer(如果需要更复杂的状态管理)
  • 样式:CSS Modules 或 Styled Components

5. 界面设计

5.1 初步界面设计草图

在搭建项目之前,可以先手绘或使用设计工具(如 Figma 或 Sketch)来设计界面草图。草图中的主要元素包括:

  • 输入框(<input>)用于添加任务
  • 添加按钮(<button>)用于提交任务
  • 任务列表(<ul>)显示当前任务
  • 每个任务项的删除按钮(<button>

5.2 代码示例

以下是任务管理应用中一个基本的任务输入和任务列表的示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import React, { useState } from 'react';

const TaskManager = () => {
const [tasks, setTasks] = useState([]);
const [inputValue, setInputValue] = useState('');

const addTask = () => {
if (inputValue.trim()) {
setTasks([...tasks, { id: Date.now(), text: inputValue, completed: false }]);
setInputValue('');
}
};

const deleteTask = (taskId) => {
setTasks(tasks.filter(task => task.id !== taskId));
};

return (
<div>
<h1>任务管理器</h1>
<input
type="text"
value={inputValue}
onChange={e => setInputValue(e.target.value)}
placeholder="添加新任务"
/>
<button onClick={addTask}>添加任务</button>
<ul>
{tasks.map(task => (
<li key={task.id}>
{task.text}
<button onClick={() => deleteTask(task.id)}>删除</button>
</li>
))}
</ul>
</div>
);
};

export default TaskManager;

6. 项目结构设计

在设计项目结构时,推荐采用以下目录结构,以保持代码的整洁和可维护性:

1
2
3
4
5
6
7
8
9
10
/task-manager-app
|-- /public
|-- /src
| |-- /components
| | |-- TaskManager.js
| |-- /styles
| | |-- App.css
| |-- App.js
| |-- index.js
|-- package.json

总结

经过以上的需求分析与设计过程,我们确立了项目的主要功能、非功能需求、技术选型和界面设计。完成这些准备工作后,我们将进入开发阶段,通过写代码实现我们的设计。继续跟随教程,我们将一步步构建出这个任务管理应用。