2.1 JSX语法

const element =Hello, world!
; // JSX语法 ReactDOM.render(element, document.getElementById('root')); // 渲染到页面
function formatName(user) {
return user.firstName + ' ' + user.lastName;
}
const user = {
firstName: 'Tony',
lastName: 'Stark'
};
const element = (
Hello, {formatName(user)}!
);
ReactDOM.render(element, document.getElementById('root')); // 渲染到页面
const element =Hello, world!; // JSX属性 ReactDOM.render(element, document.getElementById('root')); // 渲染到页面
示例一:Hello World 组件
import React from 'react';
function HelloWorld() {
return Hello, World!
;
}
export default HelloWorld;
示例二:计数器组件
import React, { useState } from 'react';
function Counter() {
const [count, setCount] = useState(0);
return (
Count: {count}
);
}
export default Counter;
示例三:表格组件
import React from 'react';
function Table(props) {
const { data } = props;
return (
| Name | Age | Gender |
|---|---|---|
| {item.name} | {item.age} | {item.gender} |
function Welcome(props) {
return Hello, {props.name}
;
}
ReactDOM.render(
,
document.getElementById('root')
);
2.2.2 类组件
示例:
import React, { Component } from 'react';
class MyComponent extends Component {
constructor(props) {
super(props);
this.state = {
count: 0
};
}
handleClick = () => {
this.setState({ count: this.state.count + 1 });
}
render() {
return (
{this.props.title}
Count: {this.state.count}
);
}
}
export default MyComponent;
表格示例:
| 属性/方法 | 描述 |
|---|---|
| state | 组件的状态对象 |
| setState() | 更新组件的状态 |
| props | 组件的输入属性 |
| render() | 描述组件UI的方法 |
| componentDidMount() | 组件挂载后调用的方法 |
| componentDidUpdate() | 组件更新后调用的方法 |
| componentWillUnmount() | 组件卸载前调用的方法 |
| 区别点 | Props | State |
|---|---|---|
| 存放位置 | 父组件传递给子组件 | 组件内部初始化 |
| 是否可变 | 不可变,只读 | 可变,可修改 |
| 对应组件类型 | 函数组件和类组件 | 只有类组件 |
| 触发视图更新 | 由父组件传递的props改变 | 由组件自身调用setState()方法 |
| 生命周期 | 不影响组件生命周期 | 可能会触发shouldComponentUpdate、componentWillUpdate、render、componentDidUpdate等生命周期 |
function ParentComponent() {
const name = "小明";
return (
name} />
);
}
function ChildComponent(props) {
return (
我是子组件
我的名字是:{props.name}
);
}
class Counter extends React.Component {
constructor(props) {
super(props);
this.state = {
count: 0
};
}
handleClick = () => {
this.setState({
count: this.state.count + 1
});
}
render() {
return (
当前计数:{this.state.count}
);
}
}
class MyComponent extends React.Component {
handleClick = (e) => {
console.log('Button clicked!');
}
render() {
return (
);
}
}
| React事件处理 | 说明 |
|---|---|
| onClick | 鼠标点击事件 |
| onDoubleClick | 鼠标双击事件 |
| onMouseDown | 鼠标按下事件 |
| onMouseUp | 鼠标松开事件 |
| onKeyDown | 键盘按下事件 |
| onKeyUp | 键盘松开事件 |
| onFocus | 元素获得焦点事件 |
| onBlur | 元素失去焦点事件 |
3.1 高阶组件
import React, { useState } from 'react';
function Example() {
// 声明一个叫 "count" 的 state 变量
const [count, setCount] = useState(0);
return (
You clicked {count} times
);
}
import React, { useState, useEffect } from 'react';
function Example() {
const [count, setCount] = useState(0);
// 相当于 componentDidMount 和 componentDidUpdate:
useEffect(() => {
// 使用浏览器的 API 更新页面标题
document.title = `You clicked ${count} times`;
});
return (
You clicked {count} times

);
}
import React, { useContext } from 'react';
const ThemeContext = React.createContext('light');
function App() {
return (
);
}
function Toolbar(props) {
return (
);
}
function ThemedButton() {
const theme = useContext(ThemeContext);
return ;
}
import React, { useReducer } from 'react';
const initialState = { count: 0 };
function reducer(state, action) {
switch (action.type) {
case 'increment':
return { count: state.count + 1 };
case 'decrement':
return { count: state.count - 1 };
default:
throw new Error();
}
}
function Counter() {
const [state, dispatch] = useReducer(reducer, initialState);
return (
<>
Count: {state.count}
>
);
}
import React, { useState, useCallback } from 'react';
function Example() {
const [count, setCount] = useState(0);
const [text, setText] = useState('');
const handleChange = useCallback(e => {
setText(e.target.value);
}, []);
return (
You clicked {count} times
text} onChange={handleChange} />
);
}
import React, { useState, useMemo } from 'react';
function Example() {
const [count, setCount] = useState(0);
const expensiveCount = useMemo(() => {
return count ** 2;
}, [count]);
return (
You clicked {count} times
Expensive count: {expensiveCount}
);
}
import React, { useState } from 'react';
function Example() {
// 声明一个叫 "count" 的 state 变量
const [count, setCount] = useState(0);
return (
You clicked {count} times
);
}
import React, { useState } from 'react';
function Example() {
const [count, setCount] = useState(0);
function handleClick() {
setCount(prevCount => prevCount + 1);
}
return (
You clicked {count} times
);
}
useState可以接受函数作为初始值:
import React, { useState } from 'react';
function Example() {
const [count, setCount] = useState(() => {
const initialCount = 0;
return initialCount;
});
return (
You clicked {count} times
);
}
useState可以使用解构赋值:
import React, { useState } from 'react';
function Example() {
const [state, setState] = useState({ count: 0, name: '张三' });
function handleClick() {
setState(prevState => {
return { ...prevState, count: prevState.count + 1 };
});
}
return (
{state.name} clicked {state.count} times
);
}
useEffect是React中的一个Hook,用于处理组件中的副作用操作,比如数据获取、DOM操作等。
useEffect的基本用法如下:
import React, { useEffect } from 'react';
function Example() {
useEffect(() => {
// 在这里处理副作用操作
return () => {
// 在组件卸载时执行清除操作
};
}, [/* 依赖项 */]);
return Example;
}
useEffect接收两个参数,第一个参数是一个回调函数,用于处理副作用操作;第二个参数是一个数组,用于指定副作用操作的依赖项,只有依赖项发生变化时,才会重新执行副作用操作。
useEffect还可以返回一个清除函数,用于在组件卸载时执行清除操作。
import React, { useContext } from 'react';
// 创建一个context
const MyContext = React.createContext();
// 在父组件中设置context的值
function Parent() {
return (
);
}
// 在子组件中使用context的值
function Child() {
const value = useContext(MyContext);
return {value};
}
3.4 React Router- React Router是什么?

4.1 创建React应用
表格语法:
| 序号 | 内容 |
|---|---|
| 1 | 使用create-react-app创建React应用 |
| 2 | 在应用中添加组件并渲染 |
| 3 | 使用props传递数据给组件 |
| 4 | 使用state管理组件内部状态 |
| 5 | 处理组件事件 |
| 6 | 使用生命周期方法控制组件行为 |
| 7 | 使用React Router实现页面路由 |
| 8 | 使用Redux管理应用状态 |
| 9 | 使用React Hooks优化组件代码 |
| 10 | 使用React测试工具进行单元测试 |
| 11 | 使用React Native开发移动应用 |
| 12 | 使用Next.js实现服务器渲染 |
| 13 | 使用React与其他技术栈进行集成,如GraphQL、TypeScript等 |
| 14 | 使用React开发实际项目的经验分享 |
| 15 | 总结与展望 |
4.2 React与其他框架集成
React与Vue.js集成
示例代码:
// 在Vue.js组件中使用React组件
React与Angular集成
示例代码:
// 在Angular组件中使用React组件
import { Component, ElementRef, Input, OnInit, ViewChild } from '@angular/core';
import * as React from 'react';
import * as ReactDOM from 'react-dom';
import { MyReactComponent } from './MyReactComponent';
@Component({
selector: 'app-my-angular-component',
template: '',
})
export class MyAngularComponent implements OnInit {
@ViewChild('reactContainer', { static: true }) reactContainer: ElementRef;
@Input() prop1: string;
ngOnInit() {
ReactDOM.render(this.prop1} />, this.reactContainer.nativeElement);
}
}
React与jQuery集成
示例代码:
// 在jQuery插件中使用React组件
(function($) {
$.fn.myJqueryPlugin = function(options) {
const settings = $.extend({}, options);
return this.each(function() {
const $this = $(this);
const props = { prop1: settings.prop1 };
ReactDOM.render(...props} />, $this[0]);
});
};
})(jQuery);
4.3 React性能优化
4.4 React测试- 使用Jest和Enzyme进行组件测试
| 测试框架 | 优点 | 缺点 |
|---|---|---|
| Jest | 快速、易用、支持快照测试 | 集成度高,不易定制 |
| Enzyme | 支持浅渲染和深渲染,易于测试组件生命周期 | 不支持React16的新特性 |
| React Testing Library | 与用户行为更贴合,测试更真实 | 不易测试组件内部状态 |
| Cypress | 可以进行端到端测试,支持调试 | 无法测试多个浏览器 |
| Sinon | 可以模拟函数和对象,易于测试异步代码 | 需要与其他测试框架一起使用 |
| Mocha和Chai | 灵活、易用,可以与其他测试框架集成 | 需要手动安装和配置 |
| Jasmine | 可以进行全栈测试,易于测试异步代码 | 集成度不高,不易定制 |
5.1 React官方文档
React官方文档:https://reactjs.org/docs/getting-started.html
React官方文档是React框架的官方文档,提供了详细的React介绍、快速上手指南、组件API等内容,是学习React的必备资料。在这里,你可以了解到React的基本概念、核心特性、组件生命周期、事件处理等知识点,并且可以通过实例代码进行实践操作,加深对React的理解。同时,React官方文档也提供了React Native、React VR等相关技术的文档,方便开发者进行深入学习和应用。
5.2 React源码解析
| 书名 | 作者 | 出版社 | 链接 |
|---|---|---|---|
| 《React源码解析》 | 陈屹著 | 机械工业出版社 | https://book.douban.com/subject/30374649/ |
5.3 React实战教程- React官方文档:https://reactjs.org/docs/getting-started.html