暗黑模式
React技术介绍
引言
React 是一个由 Facebook 开发并维护的强大的 JavaScript 库,用于构建用户界面。这个库有助于开发者创建富有交互性和动态性的 Web 应用。本文旨在详细、结构化地解析 React 的各个方面,从基础到高级概念,同时结合代码示例进行说明。
目录
- React 简介
- JSX(JavaScript XML)
- 组件与Props
- State与生命周期
- 事件处理
- 条件渲染
- 列表与Keys
- 表单
- 提升State
- 组合 VS 继承
- React Router
- 状态管理(Redux)
- Hooks
- React和APIs
- 测试与调试
- 服务器端渲染(SSR)
- 部署与优化
- 社区与资源
- 总结
1. React 简介
React 是一个用于构建用户界面的库。它允许你构建复杂的 UI,同时确保 UI 与数据状态同步。
安装与创建第一个React应用
使用create-react-app
可以轻易地创建一个React应用:
bash
npx create-react-app my-app
2. JSX(JavaScript XML)
JSX 是 JavaScript 的一种扩展,它让我们可以直接在 JavaScript 中编写类似 HTML 的标记。
jsx
const element = <h1>Hello, world!</h1>;
3. 组件与Props
组件让你可以将 UI 划分成独立可复用的片段。
函数组件
jsx
function Welcome(props) {
return <h1>Hello, {props.name}</h1>;
}
类组件
jsx
class Welcome extends React.Component {
render() {
return <h1>Hello, {this.props.name}</h1>;
}
}
使用 Props
Props 是 React 组件的输入,它们对于组件来说是只读的。
jsx
const element = <Welcome name="Sara" />;
4. State与生命周期
State 是 React 组件的私有数据存储。
添加本地State
jsx
class Clock extends React.Component {
constructor(props) {
super(props);
this.state = {date: new Date()};
}
}
生命周期方法
componentDidMount()
componentWillUnmount()
jsx
componentDidMount() {
this.timerID = setInterval(
() => this.tick(),
1000
);
}
componentWillUnmount() {
clearInterval(this.timerID);
}
5. 事件处理
在 React 中,事件处理非常简单并且易于理解。事件名采用小驼峰命名,而不是全小写。
jsx
<button onClick={handleClick}>
Click me
</button>
事件处理函数
jsx
function handleClick() {
console.log('The button was clicked.');
}
6. 条件渲染
在 React 中,你可以用条件语句创建不同的 UI 片段。
jsx
function Greeting(props) {
const isLoggedIn = props.isLoggedIn;
if (isLoggedIn) {
return <h1>Welcome back!</h1>;
} else {
return <h1>Please sign up.</h1>;
}
}
7. 列表与 Keys
React 中的列表渲染和 JavaScript 中的数组方法有着很多相似之处。
jsx
const numbers = [1, 2, 3, 4, 5];
const listItems = numbers.map((number) =>
<li key={number.toString()}>{number}</li>
);
8. 表单
React 中的表单元素和其他 DOM 元素略有不同,因为表单元素在 React 中是可控组件。
jsx
class NameForm extends React.Component {
constructor(props) {
super(props);
this.state = {value: ''};
}
handleChange = (event) => {
this.setState({value: event.target.value});
}
render() {
return (
<form>
<label>
Name:
<input type="text" value={this.state.value} onChange={this.handleChange} />
</label>
</form>
);
}
}
9. 提升 State
在 React 中,多个组件需要共享数据时,可以通过提升 State 达到这一目的。
jsx
function BoilingVerdict(props) {
if (props.celsius >= 100) {
return <p>The water would boil.</p>;
}
return <p>The water would not boil.</p>;
}
10. 组合 VS 继承
React 推荐使用组合而非继承来达到组件之间的代码复用。
jsx
function FancyBorder(props) {
return (
<div className={'Fancy Fancy-' + props.color}>
{props.children}
</div>
);
}
11. React Hooks
React Hooks 是从 React 16.8 版本开始添加的新特性,它允许你在不编写 class 的情况下使用 state 和其他 React 特性。
useState
最基础的 Hook 是 useState
。
jsx
import React, { useState } from 'react';
function Example() {
const [count, setCount] = useState(0);
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}
useEffect
useEffect
Hook 可以让你在函数组件中执行副作用操作。
jsx
import React, { useState, useEffect } from 'react';
function Example() {
const [count, setCount] = useState(0);
useEffect(() => {
document.title = `You clicked ${count} times`;
});
return (
// ... same as above
);
}
12. 高阶组件(HOC)
高阶组件(HOC)是一种用于复用组件逻辑的高级技术。
jsx
function withSubscription(WrappedComponent, selectData) {
return class extends React.Component {
constructor(props) {
super(props);
this.state = {
data: selectData(DataSource, props)
};
}
// ...
}
}
13. React Router
React Router 是一种基于 React 之上的强大路由库,它可以让你添加新的屏幕和流程到你的应用,同时保持 URL 与之同步。
jsx
import { BrowserRouter as Router, Route, Link } from 'react-router-dom';
function App() {
return (
<Router>
<div>
<nav>
<ul>
<li>
<Link to="/">Home</Link>
</li>
<li>
<Link to="/about">About</Link>
</li>
</ul>
</nav>
<Route path="/" exact component={Home} />
<Route path="/about" component={About} />
</div>
</Router>
);
}
14. 状态管理库 Redux
Redux 是一种用于管理状态的可预测的状态容器。它主要用于 JavaScript 应用,尤其是单页面应用。
javascript
import { createStore } from 'redux';
function counter(state = 0, action) {
switch (action.type) {
case 'INCREMENT':
return state + 1;
case 'DECREMENT':
return state - 1;
default:
return state;
}
}
let store = createStore(counter);
15. 测试与调试
在前端开发中,测试和调试是非常重要的环节。React 社区有一系列成熟的测试工具和库。
Jest
Jest 是一个流行的 JavaScript 测试框架,与 React 有很好的集成。
javascript
// sum.test.js
const sum = require('./sum');
test('adds 1 + 2 to equal 3', () => {
expect(sum(1, 2)).toBe(3);
});
React Testing Library
这个库提供了一系列 React 组件测试的工具。
jsx
import { render, fireEvent } from '@testing-library/react';
import Button from './Button'; // 你的组件
test('button click changes props', () => {
const { getByText } = render(<Button label="click me please" />);
const button = getByText('click me please');
fireEvent.click(button);
expect(button.textContent).toBe('You clicked me!');
});
16. 服务器端渲染(SSR)
React 支持服务器端渲染,这通常用于改进首次加载性能或SEO。
jsx
import React from 'react';
import ReactDOMServer from 'react-dom/server';
const element = <h1>Hello, world</h1>;
const html = ReactDOMServer.renderToString(element);
17. 部署与优化
前端应用的部署和优化也是一个大话题,包括但不限于代码拆分、懒加载、持续集成等。
代码拆分
通过Webpack等工具,你可以将代码拆分成不同的小块,然后按需加载。
javascript
import(/* webpackChunkName: "my-chunk-name" */ './module').then(({ default: myModule }) => {
// 使用模块
});
18. 社区与资源
React 有一个庞大并且活跃的社区,你可以在以下平台获取更多的信息和帮助:
推荐阅读
19. 总结
React 是一个非常强大和灵活的前端框架,它允许开发者以组件化的方式构建用户界面。这篇文章详细介绍了 React 的各个方面,从基础语法和概念到更高级的主题,如状态管理、路由、测试、服务器端渲染、和部署。
我们讨论了如何使用 JSX 来描述 UI,以及如何通过组件和 props 创建复杂的 UI。文章也涉及了 React 中状态管理的不同方式,包括使用 React 自身的 useState
和 useEffect
,以及第三方库 Redux 和 MobX。
我们还讨论了如何使用路由库(如 React Router)来管理应用的导航,以及如何利用各种测试工具和库(如 Jest 和 React Testing Library)来确保代码质量。
在服务器端渲染(SSR)和代码优化方面,我们也有所涉及,这些是任何大型应用都需要考虑的关键因素。
最后,我们也简要介绍了 React 的社区和其他学习资源,以便你能进一步扩展你的知识和技能。
总体而言,React 是一个不断发展的生态系统,具有广泛的应用场景和丰富的功能。无论你是一个前端新手,还是一个经验丰富的开发者,掌握 React 都将是一个长远和有价值的投资。