今天在學習styled-components的theming
時,關於styled-components
對主題的實現與管理上提到,主要應用到了react
的context api,所以好好研讀了一下官方文件,對該api做了如下記錄。
當我們使用react
時,很容易的通過觀察元件的props
來跟蹤元件間的資料流流向,這種跟蹤觀察方式也讓我們很容易的去理解元件。
而有的時候,我們不想讓乙個props
從最外層,通過元件一層一層的傳遞到目標元件上,這時就可以通過context
來直接實現我們希望的操作。
假設有個如下的結構:
class button extends react.component
);}}
class message extends react.component delete
);}}
class messagelist extends react.component
; }
}
上面的例子中,我們把color
手動的方式傳給了button
,這期間穿越了message
,而對message
本身沒有什麼用。如果用context
的話,可以直接給到button
元件上,如下:
const proptypes = require('prop-types');
class button extends react.component
);}}
button.contexttypes = ;
class message extends react.component delete
);}}
class messagelist extends react.component ;
} render()
; }
}messagelist.childcontexttypes = ;
通過給messagelist
(context宿主)新增childcontexttypes
和getchildcontext
,可以實現在該元件子結構下的所有元件(e.g. button)直接通過定義contexttypes
來獲取。
如果未定義contexttypes
的話,context
是乙個空物件。
一旦元件定義了contexttypes
以後,以下的勾子中就會得到乙個附加的引數——context
物件:
無狀態元件同樣可以通過給函式定義contexttypes
屬性的方式,讓元件擁有獲取context
的能力,例如:
const proptypes = require('prop-types');
const button = (, context) =>
;button.contexttypes = ;
不要更新context!
react
雖然有提供關於更新context
的api,但不建議去使用。
如果想用的話,可以看下面的這個例子。
getchildcontext
方法會在state
或props
更新時被呼叫,可以通過區域性狀態的更新進而來更新context
。當context
更新後,所有的子元件都能接到新值。
const proptypes = require('prop-types');
class mediaquery extends react.component ;
} getchildcontext() ;
} componentdidmount() );}};
window.addeventlistener('resize', checkmediaquery);
checkmediaquery();
} render()
}mediaquery.childcontexttypes = ;
這裡有個問題是,如果宿主元件的context
更新了,其下使用該context
的子元件可能因為某個父元件的shouldcomponentupdate
返回false
而不做狀態更新。這就完全不符合通過使用context
來控制項狀態更新的初衷,所以證明使用context
來管理元件狀態不太靠譜。
這裡有篇部落格關於介紹如何安全的使用context
的。
絕大多數的應用程式是不需要使用context
的。
如果你想要你的應用穩定,就不要使用它,這是乙個實驗性的api,在未來的版本更新中很有可能會被棄掉。
context最好的使用場景是隱式的傳入登入的使用者,當前的語言,或者主題資訊。要不然所有這些可能就是全域性變數,但是context讓你限定他們到乙個單獨的react樹里。
如果專案對資料管理較為複雜,推薦使用類似於redux或mobx這樣的狀態管理庫,而不要使用context
。
react中Context的使用
context 提供了乙個無需為每層元件手動新增 props,就能在元件樹間進行資料傳遞的方法。props單向資料流動 如果覺得props傳遞資料很繁瑣,可以採用context,進行跨元件傳遞資料 例如給子代元素傳遞一筆錢 手動新增狗頭 為了後續使用方便,封裝乙個元件 import from rea...
react中Context的使用
context 提供了乙個無需為每層元件手動新增 props,就能在元件樹間進行資料傳遞的方法。props單向資料流動 如果覺得props傳遞資料很繁瑣,可以採用context,進行跨元件傳遞資料 例如給子代元素傳遞一筆錢 手動新增狗頭 為了後續使用方便,封裝乙個元件 import from rea...
react中context傳遞資料
在乙個典型的 react 應用中,資料是通過 props 屬性自上而下 由父及子 進行傳遞的,但這種做法對於某些型別的屬性而言是極其繁瑣的 例如 地區偏好,ui 主題 這些屬性是應用程式中許多元件都需要的。context 提供了一種在元件之間共享此類值的方式,而不必顯式地通過元件樹的逐層傳遞 pro...