場景:在一個動態生成的多個組件裏面,可能一個組件依賴於另外一個組件的值而變化react
咱們首先想到的是redux,這一個能夠保存供多個組件使用的解決方案redux
方法:建立咱們本身的reducer,使用useContext提供使用ide
const { PageData, activeComponent } = useContext(PageContext);
在具體的場景裏面,個人PageData存儲的頁面信息,activeComponent當前選中的頁面組件的索引函數
不出所料,咱們果真能夠正確使用,this
bug:可是,在拉入下一個組件的時候,報錯以下spa
百度以後https://stackoverflow.com/questions/53472795/uncaught-error-rendered-fewer-hooks-than-expected-this-may-be-caused-by-an-acc發現元問題出現的緣由:code
咱們的組件動態生成是存在判斷條件的,也就是經過判斷組件的type屬性選擇對應的組件blog
switch (type) { case 'Array': EditorComp = () => { return <React.Fragment>{UseArrInput(props, value, handleChange)}</React.Fragment>; }; break; case 'Object': EditorComp = () => { return <React.Fragment>{UseObjectInput(props, value, handleChange)}</React.Fragment>; }; break; default: EditorComp = () => { return <React.Fragment>{Editor(props, value, handleChange)}</React.Fragment>; }; break; }
而react的鉤子官方要求以下索引
不要在循環,條件或嵌套函數中調用Hook。相反,始終在React函數的頂層使用Hooks。經過遵循此規則,您能夠確保每次組件呈現時都以相同的順序調用Hook。這就是容許React在多個useState
和useEffect
調用之間正確保留Hook狀態的緣由。ci
最終解決方案:選擇在沒有判斷條件的頂層使用useContext,將獲取的值,做爲參數傳給組件使用!