React 简介

React 起源于 Facebook 内部项目,用来架设 Instagram 网站,并于 2013 年 5 月开源。React 拥有较高的性能,代码逻辑非常简单,越来越多的人已开始关注和使用它。

React 主要的原理

  • Virtual DOM 虚拟 DOM; 传统的 web 应用,操作 DOM 一般是直接更新操作的,DOM 更新通常是比较昂贵的。而 React 为了尽可能减少对 DOM 的操作,提供了一种不同的而又强大的方式来更新 DOM,代替直接的 DOM 操作。就是 Virtual DOM,一个轻量级的虚拟的 DOM,就是 React 抽象出来的一个对象,描述 DOM 应该什么样子的,应该如何呈现。通过这个 Virtual DOM 去更新真实的 DOM,由这个 Virtual DOM 管理真实 DOM 的更新。
  • React 有个 diff 算法,更新 Virtual DOM 并不保证马上影响真实的 DOM,React 会等到事件循环结束,然后利用这个 diff 算法,通过当前新的 dom 表述与之前的作比较,计算出最小的步骤更新真实的 DOM。

使用 React 应用脚手架 create-react-app

  • 开箱即用
  • 安装 Node.js 环境
    • npm install -g create-react-app
    • create-react-app demo-app
    • cd demo-app
    • npm start

React 快速上手 - 图1

package.json 说明
  • scripts
  1. "scripts": {
  2. "start": "react-scripts start", // 开始运行项目
  3. "build": "react-scripts build", // 生成环境构建
  4. "test": "react-scripts test", // 测试用例
  5. "eject": "react-scripts eject" // 自定义 webpack 配置
  6. },
  • dependencies React 运行所需依赖
  1. "dependencies": {
  2. ...
  3. "react": "^17.0.1",
  4. "react-dom": "^17.0.1",
  5. "react-scripts": "4.0.3"
  6. ...
  7. },

运行项目 npm start,项目默认在 3000 端口,

React 快速上手 - 图2

React JSX 语法

  • 使用 ReactDOM.render 进行渲染
  1. const element = <div>这是一个元素</div>;
  2. ReactDOM.render(element, document.getElementById("app"));
  • 可以通过 jsx 定义 html 元素,render 函数进行渲染。
    注意 在渲染的更节点只允许一个元素存在,不然会报错,不能正常渲染。
  • 设置样式时不能用 class 设置, 用 className 进行设置。
  • 使用 style, 需要使用 大写
  1. const styleName = { marginLeft: 10 };
  2. const element = <div style={styleName}>测试应用</div>;
  3. ReactDOM.render(element, document.getElementById("app"));
  • 定义事件,React 事件和原生 html + js 定义事件一直,React 定义事件需要大写,驼峰命名
  1. const element = (
  2. <div>
  3. <p
  4. onClick={() => {
  5. console.log("点击事件");
  6. }}
  7. >
  8. 事件定义
  9. </p>
  10. </div>
  11. );
  12. ReactDOM.render(element, document.getElementById("app"));
  • 简单表达式
  1. const element = <div>{1 + 1}</div>;
  2. ReactDOM.render(element, document.getElementById("app"));
  3. const element = <h1>{index == 1 ? "显示" : "不显示"}</h1>;
  4. ReactDOM.render(element, document.getElementById("app"));
  • 注释

React 快速上手 - 图3

React 组件化

  • 在 react 中,一切皆组件,根据划分不同组件,可以使代码复用,减少代码编写
  • 定义组件分 ES6 和 函数组件
  • ES6 class 方式定义需要继承 React.Component,实现 render 函数,返回一个元素
  1. class ClassComponent extends React.Component {
  2. render() {
  3. return <div>是一个 Class 组件</div>;
  4. }
  5. }

React 快速上手 - 图4

  • 函数组件
  1. const FunctionComponent = () => <div>是一个 Function 组件</div>;

React 快速上手 - 图5

  • 浏览器查看效果

React 快速上手 - 图6

React state & props

  • state 在 react 组件中可以保存当前所操作数据状态
  • props 可以通过父子组件进行数据传递和交互
  • 使用 ES6 组件方式使用 state
  1. class ClassComponent extends React.Component {
  2. state = {
  3. count: 0,
  4. };
  5. handleAdd = () => {
  6. const { count } = this.state;
  7. this.setState({ count: count + 1 });
  8. };
  9. handleReduce = () => {
  10. const { count } = this.state;
  11. this.setState({ count: count - 1 });
  12. };
  13. render() {
  14. const { count } = this.state;
  15. return (
  16. <div>
  17. <p>Class 组件</p>
  18. <p>点前计数 {count}</p>
  19. <button onClick={this.handleAdd}>加</button>
  20. <button onClick={this.handleReduce}>减</button>
  21. </div>
  22. );
  23. }
  24. }
  • 使用 函数 组件方式使用 state
  • 函数组件操作 state 可以使用 hooks 操作
  • hooks 函数为 React 16.8 引入新 API,方便处理传统 React 方式操作数据
  1. import React, { useState } from "react";
  2. const FunctionComponent = () => {
  3. const [count, setCount] = useState(0);
  4. const handleAdd = () => {
  5. setCount(count + 1);
  6. };
  7. const handleReduce = () => {
  8. setCount(count - 1);
  9. };
  10. return (
  11. <div>
  12. <p>Function 组件</p>
  13. <p>点前计数 {count}</p>
  14. <button onClick={handleAdd}>加</button>
  15. <button onClick={handleReduce}>减</button>
  16. </div>
  17. );
  18. };

React 快速上手 - 图7

props 使用
  • 定义
  1. const App = () => {
  2. return (
  3. <div className="App">
  4. <ClassComponent title="Class Props Title" />
  5. <FunctionComponent title="Function Props Title" />
  6. </div>
  7. );
  8. };
  9. export default App;

React 快速上手 - 图8

  • 接收,使用
  • Class 组件

React 快速上手 - 图9

  • Function 组件

React 快速上手 - 图10

  • 效果

React 快速上手 - 图11

React 生命周期

  • 16.x 和 17.x 版本,对应生命周期函数有所变化
  • 被打横线生命周期函数在 React 17.x 版本已被移除,不建议使用

React 快速上手 - 图12

  • 常用生命周期函数
  1. // 组件被挂载
  2. componentDidMount() {}
  3. // 发生异常
  4. componentDidCatch() {}
  5. // 组件重新渲染 组件状态 || 属性改变
  6. componentDidUpdate() {}
  7. // 判断组件是否应该重新渲染,默认 true
  8. shouldComponentUpdate(nextProps, nextState) {}
  9. // 组件将被卸载
  10. componentWillUnmount() {}
  • componentDidMount 数据加载,网络请求
  • componentDidCatch 捕获异常,上报
  • shouldComponentUpdate 组件发生变化,需要重新调整逻辑,重新渲染组件
  • componentWillUnmount 清除资源,比如定时器,防止内存泄露

hooks useEffect
  1. useEffect(() => {
  2. // did mount
  3. // ajax request
  4. return () => {
  5. // un mount
  6. // clear resource
  7. };
  8. // 当 value 发生变化,重新触发
  9. }, [value]);

总结

能够正确使用 React 生命周期函数和 state & props,事件定义。可以解决大部分 React 项目开发。