React参考React源码React为什么JSX实用?萝卜青菜,各有所爱。但是react团队认为模板方案不好:模板分离了技术栈,增加了技术点。看起来像html的jsx。react的规则太强了,需要jsx来辅助。比如在使用vue时,上面是html模板,下面是js逻辑组成一个组件功能。但是React在一个类中同时运行html和运行逻辑。JSX是如何映射虚拟DOM的?JSX是creatElement的语法糖,使用了babel的escaper。其实是通过两个方法完成的,一个是createElement,一个是reactElement//定义一个react对象reactElement(type,key,ref,self,source,ReactCurrentOwner.current,props)RreactDFMDataDrivenView?UI=render(data)数据和状态有什么区别?状态(state)和数据(data),组件中的通信是数据的通信,react的核心是数据的管理数据流:父->子->父兄无关系单向数据flowMVC双向数据流的缺点。造成混乱。Action->Dispatcher->Store->View|--------<--------Action<-|ACTION视图层redux发送的消息是js的状态容器Action->Reducer->Store[state,state]|--------<------View--<-|redux优缺点缺点:使用过程复杂。状态不会随组件一起销毁,状态会一直存在。商店经常更新时,会比较卡。不支持ts。mobx的原理是利用es6代理数据劫持,使用redux也不会??复杂。ReactFiber将在16毫秒后丢帧。原来React是使用js的执行栈,一直执行到栈空的位置。新版本的React维护了自己的执行栈,通过链表的形式遍历树结构来优化执行过程。参考虚拟DOM和diff算法VirtualDOMReact是一种渲染dom的优化方法。原理是使用createFragment,即“创建片段”。所有的DOM操作都会以“片段”的形式进行,直到操作完成,然后一起渲染。diff算法是React更新dom元素的一套算法。其核心思想是对“节点树”的每个节点进行比较,根据比较结果决定是否更新该节点。通过其优化方法,更新树的时间复杂度从O(n^3)变为O(n)。diff策略忽略跨组件移动操作。相似的组件创建同一棵树,不同类型创建不同类型的兄弟(ReactComponent和functionComponent)。key分为3种更新策略:treediff、componentdiff、elementdiff:treediff:遇到树结构更新时,只比较同级节点,只创建和删除子节点。这意味着如果有中间节点移动某个树结构,原树会直接删除该节点及其子节点,并在新树中创建该节点及其子节点。另外,官方不建议跨节点进行移动操作。Componentdiff:当一个节点更新为不同类型的节点时,它就变成了脏组件。React认为不同类型的一个更新节点的结构一定是不同的(树结构),所以直接删除节点,直接创建。elementdiff:计算兄弟节点的直接移动操作。将原来删除并重新创建目标节点的更新策略改为通过标识key来判断是否为原始节点。此外,它还获得了判断是否发生移动操作的依据。由此得出3条优化建议:设置key,不要将组件更新为不同的类型,减少将兄弟组件从尾部移到头部的操作,参考Redux待补充React优化常见优化详解:function组件而不是类组件->为什么?参考1参考2HOC在使用redux等状态管理工具时,一些不常用的状态不需要挂载到模型中-->为什么?首屏优化方案lazy延迟加载组件react-router加载提升体验ssr(服务端渲染)和csr(客户端渲染)pureComponent和shouldUpdate优化更新频率componentDidCatch检测错误边界通过render函数中的Fragment变量声明减少标签深度提升外出,减少GCReact-HooksuseState相当于类组件中的setState。functionrender(){ReactDom.render(
