使用API React.createContext 返回的是组件对象 可以利用结构的方式
使用Provider包裹的组件都可以获取提供者的value
Context.Consumer组件里面使用函数 函数返回一个组件 函数的参数为Context初始化的参数
Context.Provider包裹所有的组件static contextType = 创建的Context 则会自动向上查找 然后在组件内部可以通过this.context获取值dom插入到其他dom下面ReactDOM.createPortal(需要插入的节点, 需要挂载的节点)React.createPortal(Component, nodeElement)
state 复用逻辑 操作方式可以直接使用ES7装饰器hoc生命周期 组件的didMount -> hocDidMount -> hocwillMount -> hocwillUnMount -> unMountHOC都有一个通病就是props可能重复
例如:
A组件需要修改名字 B组件也需要修改名字 就可以将状态提升 利用HOC 传入修改事件以及传入的值Loading操作 每个组件都有一个loading状态 利用hoc接收一个loading是否显示的状态 然后用这个loading状态控制显示loading组件还是业务组件鼠标移动例子 所有的组件都需要获取在某个组件内的鼠标移动x y
const withMouse = Component => {
return class extends React.Component {
state = {
x: 0,
y: 0
};
handleMouseMove = event => {
this.setState({
x: event.clientX,
y: event.clientY
});
};
render() {
return (
<div onMouseMove={this.handleMouseMove}>
<Component {...this.props} mouse={this.state}/>
</div>
);
}
}
}与HOC惊人的相似。当是不会再出现props重复的问题。实际上就是一个回调函数 作用都是获取外部数据
// 例如
将重复的操作放在 组件内部
组件内部通过调用外部的render方法 实现将外部组件可以获取组件内部的state 从而不影响props的传递
class Mouse extends React.Component {
static propTypes = {
// render: required
};
state = {
x:0,
y:0
};
handleMouseMove = (event) => {
this.setState({
x: event.clientX,
y: event.clientY
})
};
render() {
return (
<div onMouseMove={this.handleMouseMove}>
{this.props.render(this.state)}
</div>
);
}
} const ref = React.createRef()
React.forwardRef((props, ref) => {
<Component ref={ref}>
})ref则会成为叶子组件的ref
<>
<div>hello</div>
</>React.lazy(() => import('./Component'));
webpack将所有打包成为一个文件 导致文件特别大 不利于代码拆分 这个时候需要代码拆分const OtherComponent = React.lazy(() => import('./OtherComponent')); 这样导入的组件 如果有多个懒加载组件 那么展示会以加载时间最长的组件显示React.suspense 参数 fallback 懒加载过程中需要展示的内容promiseComponentDidCatch捕获到这个promise的异常 pending状态下渲染fallbackresolve时重新render 遇到下一个异步请求重复上面操作promise对象都将resolve 将loading换成真正的组件HOOK提供了一系列函数式组件的钩子
const [value, setValue] = useState();
value则是state状态 setValue 则是个函数 需要设置值直接调用setValue 传入需要设置的值即可
useEffect 传入一个匿名函数 该匿名函数的作用相当于DidMount和DidUpdate 可以在匿名函数里面返回一个函数区别点: 前者自带通过props和state的浅对比来实现shouldComponentUpdate 而后者没有 只要props变化就会重新render
foo = {a: 1} bar = foo bar.a = 2这个时候区对比foo和bar是一样的 一般解决是使用深拷贝 则可以 引用immutable 也可以优化requestAnimationFrame 节流 浏览器会确保每一秒是60帧 可以防止每秒超过60帧的操作 自己限流异步处理 多次增加数据会导致数据返回不到预期 可以使用函数形式处理
为什么使用异步处理?
setState不会立马改变React组件和state的值setState通过触发一次组件的更新来引发重绘setState函数调用产生的效果会合并本文为作者原创,手码不易,允许转载,转载后请以链接形式说明文章出处。