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源碼以下: