一、基础知识
1.特点:声明式、组件化、跨平台编写。
2.react一定程度上解决等待资源加载(React.Lazy,React.Suspense,ErrorBoundary),跟浏览器线程(js会阻塞浏览器渲染)执行(异步更新,时间切片,React Fiber)的问题。
React.lazy 函数能让我们像渲染常规组件一样处理动态引入(的组件);
如果在 App 渲染完成后,包含 OtherComponent 的模块还没有被加载完成,我们可以使用加载指示器为此组件做优雅降级。这里我们使用 Suspense 组件来解决;
ErrorBoundary 捕获子组件的渲染异常,在渲染页面出错时,提供备用UI。
eg:
二、react更新流程:主要靠三个“车间”——调度器,协调器,渲染器。
调度器:要进行优先级调度;协调器:会确定fiber;渲染器:管理react树。
(协调器要让整个fiber树渲染好了之后再给渲染器渲染,然后渲染器渲染好后传给调度器,选择高级任务执行)
react有双渲染树(类似vue)
三、函数式组件和class组件
1.组件架构 数据:通过定义state操作视图,mount是获取数据更新state,ref保存与视图无直接相关的值,unmount前清空ref---通信:props父子组件通信,context&redux组件间信息共享--->ui:通过ref获取到DOM。(定时器可能用到ref) 2.函数:没有生命周期,return JSX,借助Hook; (1)hook只能在最顶层使用(eg:
)例子中if应该写下自useEffect函数中;
(2)hook只能在react函数中调用;
(3)hook会有过期闭包问题。
对比之下,class组件有生命周期,有构造、继承函数,this调用方法数据,有render渲染方法。
记录一些常见的react API &HOOK:
四、在项目中拆分组件粒度:layout——page——component
五、组件之间通信
1.父子组件: 父与子:prop,cloneElement;子与父:prop,forwardRef; ps:若有参数,要在函数中传入 (在VUE中,使用props传递)
2.组件间通信: useContext & useReducer (eg:
)
分析:利用useContext把globalContext传入
redux:(eg:
)
分析:将store中的state传入props中
(VUE中,组件间通过bus传递信息)
六、组件性能优化 使用userCallback(返回函数),userMemo(返回值),memo
q1.1:在内存中没有两个相等的对象
七、组件挂载
传入容器,组件挂载容器中,没有传入容器就挂载在本身
使用portal:将真实DOM的渲染位置改变了