React的工作原理
- UI = f(data),data包括props和state,改变data从而使UI发生改变,而不是直接操作UI
- 一切都是组件
- 声明式编程
React生命周期
分为三个阶段,MOUNTING,RECEIVE_PROPS,UNMOUNTING。
阶段一:MOUNTING
mountComponent负责生命周期中的getInitialState、componentWillMount、render和compontDidMount。
getDefaultProps指定默认的props值,通过构造函数进行管理,生命周期中最早执行的,只执行一次。
componentWillMount中如果调用setState方法,不会触发重新render,而是会进行state合并,所以最新的state需要在render中才能取到。
mountComponent是通过递归渲染内容,由于递归特征,所以父组件componentWillMount在子组件的componentWillMount之前调用,而父组件的componentDidMount在其子组件的componetDidMount之后。
阶段二:RECEIVE_PROPS
updateComponet负责管理生命周期中的componentWillReceiveProps、shouldComponentUpdate、componentWillUpdate、render和componentDidUpdate。
componentWillReceiveProps中使用setState是不会触发重新render,会进行state合并,只有在render和componentDidUpdate才能获得最新的state值。
shouldComponentUpdate判断组件是否要进行更新,这也是性能优化的核心点。
updateComponent本质上也是通过递归渲染内容的,所以父组件componentWillUpdate在子组件componentWillUpdate之前,componentDidUpdate在子组件componentDidUpdate之后。
阶段三:UNMOUNTING
unmountComponent负责管理生命周期中的componentWillUnmount调用setState是不会重新render的,会重置所有相关参数、更新队列以及更新状态。
diff算法
传统diff算法通过循环递归对节点依次比较,算法复杂度达到O(n^3),React的diff算法复杂度是O(n)。
diff算法:从根节点开始,递归的方式逐步往下比对,先比较两个节点的类型是否相同,如果不相等,就彻底放弃掉,然后unmount,再重新mount,如果类型相同,就走update生命周期。
对于同一级的一组字节点,需要设置设置一个key,key要保持唯一,稳定,不推荐使用数组下标index当作数组的key,比如可以使用数据源中每一项的id(如果数据源每一项存在唯一的id值)。
React中一切皆为组件
好的组件不受其他组件约束,只要遵守一样的props。
声明式编程
对应函数式编程,只需要声明画成什么样子,具体画成什么样是怎么画的,都交给React。
函数式编程关心数据的映射,命令式编程关心解决问题的步骤
使用props还是state
props:外部传入的数据
state: 组件内部状态,尽量少,推动到系统边缘处
父级组件所传递的props,作为子级的state,会产生引用对象影响问题,也就是更改子级state,父级props被相应更改。
简单总结
最新推荐文章于 2024-05-11 21:36:55 发布