JSX语法
1 | const text = { |
class组件和函数组件
1 | // class组件 |
React event 事件
1 | clickHandle = (event) => { |
Form表单
1 | // 用 htmlFor 代替 for |
受控组件 vs 非受控组件
- 优先使用受控组件,符合React设计原理;
- 必须操作DOM时,再使用非受控组件;
1 | // 受控组件 |
1 | // 非受控组件 - 使用场景 |
setState
- 不可变值(函数式编程,纯函数);
1 | /** 不能直接修改 this.state 里的属性的值 **/ |
- 可能是异步更新;
1 | 1. this.setState 直接使用是异步的,需要回调里接收最新值 |
- 可能会被合并;
1 | 1. 传入对象,会被合并(类似 Object.assign )。执行结果只一次 +1 |
组件生命周期
函数组件和Class组件的区别
函数组件
- 纯函数,输入props,输出JSX;
- 没有实例,没有生命周期,没有state;
- 不能扩展其他方法;
Portals 作用和使用场景
子组件逃离父组件
- overflow: hidden
- 父组件 z-index 值太小
- fixed 需要放在 body 第一层级
1 | class App extends React.Component { |
Context
- 主要用于数据的传递,逻辑不复杂的场景,如主题切换,语言切换等;
- 主要api,1. 生产数据:Context.Provider;
- 消费数据 函数组件:Context.Consumer,Class组件:static contextType = ThemeContex;
1 | // demo 主题切换 |
异步组件
- import()
- React.lazy
- React.Suspense
1 | import React from 'react' |
*性能优化(重要)
- shouldComponentUpdate 简称(SCU)
- SCU默认返回 true,即 React 默认重新渲染所有子组件;
- 必须配合”不可变值“一起使用;
- 可先不用SCU,有性能问题时在考虑使用;
- PureComponent 和 React.memo
- Class组件 PureComponent,SCU中实现了浅比较;
- memo,函数组件中的PureComponent;
- 浅比较已使用大部门情况(尽量不要做深度比较);
- 不可变值 immutable.js
- 彻底拥抱”不可变值“;
- 基于共享数据(不是深拷贝),速度好;
- 有一定学习和迁移成本,按需使用;
1 | // shouldComponentUpdate Demo |
关于组件公共逻辑的抽离
- mixin,已被 React 弃用
- 高阶组件 HOC
- Render Props
HOC vs Render Props
- HOC:模式简单,但会增加组件层级;
- Render Props:代码简洁,学习成本高;
- 按需使用;
1 | // 高阶组件 HOC Demo 7-24 |
1 | // Render Props 7-25 |
React.createRef() 使用
1 | // demo |