Reac知识图谱react
简单层级传递,如父子,可使用props。算法
<Child title="数据"/>
复制代码
祖先与子孙,跨层级数据传递或者兄弟组件通讯:Context、第三方状态管理库如redux、mobx等。redux
const TheContext = React.createContext();
复制代码
<TheContext.Provider>
<Child/>
</TheContext.Provider>
复制代码
//contextType
class Child extends Component {
contextType = TheContext;
componentDidMount() {
console.log(this.context); //sy-log
}
render() {
return <div>呵呵呵</div>;
}
}
//useContext
function Child(props) {
const context = useContext(TheContext);
console.log(context); //sy-log
return <div>哈哈哈</div>;
}
//Consumer 函数类组件均可
function Child(props) {
return (
<div> <TheContext.Consumer> {(context) => { console.log(context); //sy-log return <div>嗯嗯嗯</div>; }} </TheContext.Consumer> </div>
);
}
复制代码
setState(updater, [callback]);
复制代码
update:object | function。若是是object,则会与类组件中上次的state对象合并,若是是函数,(prevState, nextProps)=>{ return newState };
数组
callback:可选,回调函数。markdown
类组件中的setState是批量更新,即咱们常说的异步。可是在原生事件和setTimeout中是同步的。react-router
key标记了节点在当前层级下的惟一性,和组件类型一块儿用于diff时候判断节点是否能够复用、是否要删除、是否要新增。dom
有时表现出异步,有时表现出同步。异步
fiber在React源码中表现为一个节点对象,仍然是虚拟dom,表现为单链表结构。其中child属性是第一个子fiber节点,sibling是下一个兄弟节点。ide
算法复杂度:O(n)函数
React中这个diff算法复杂度的前提是:深度优先遍历、同级比较、只有key值和类型彻底相同的组件才能够复用。
接下来如下图为例,来讲一下React diff的流程:
假设上面的树为老的虚拟dom节点,下面的树为新的虚拟dom节点,圆形和多边形节点标识不一样的组件类型,大写字母标识节点的key。
目前任何一个状态管理库都不是强制使用的,也有不少精小的项目不使用第三方状态管理库,而只是使用React自身的state、useContext等API就能够达到目的。固然,对于大型项目,仍是建议使用一个状态管理库,毕竟项目越大,须要管理、共享的状态越多,这个时候为了不data层与view层变成一锅粥,仍是使用个状态管理库吧。
redux、mobx、recoil(实验阶段)。
redux自己是不支持异步的,可使用中间件,redux-thunk、redux-saga。
Route有三种互斥的组件渲染方式,按照优先级高低分别是children、component、render。
children是不论是否匹配都会渲染,而component和render都是匹配了才会渲染。另外,children和render的参数是函数,而component的参数是React组件。
当你用component
的时候,Route会用你指定的组件和React.createElement建立一个新的[React element]。这意味着当你提供的是一个内联函数的时候,每次render都会建立一个新的组件。这会致使再也不更新已经现有组件,而是直接卸载而后再去挂载一个新的组件。所以,当用到内联函数的内联渲染时,请使用render或者children。
react-router中Route的render源码以下: