摘要:介紹是的一個重要屬性,但是到目前為止,這個屬性在正式的文檔里面還沒有對它進行正式介紹,在將會正式發布這個屬性。指定的傳遞給子組件的屬性需要先通過來指定,不然會產生錯誤。這樣可以減少組件之間的直接依賴關系。
介紹
Contexts 是React的一個重要屬性,但是到目前為止,這個屬性在正式的文檔里面還沒有對它進行正式介紹,在 reactv0.1.4將會正式發布這個屬性。下面先來介紹一下它的使用方式。
React.withContextReact.withContext 會執行一個指定的上下文信息的回調函數,任何在這個回調函數里面渲染的組件都有這個context的訪問權限。
var A = React.createClass({ contextTypes: { name: React.PropTypes.string.isRequired, }, render: function() { returnMy name is: {this.context.name}; } }); React.withContext({"name": "Jonas"}, function () { // Outputs: "My name is: Jonas" React.render(, document.body); });
任何想訪問context里面的屬性的組件都必須顯式的指定一個contextTypes 的屬性。如果沒有指定改屬性,那么組件通過 this.context 訪問屬性將會出錯。
如果你為一個組件指定了context,那么這個組件的子組件只要定義了contextTypes 屬性,就可以訪問到父組件指定的context了。
var A = React.createClass({ render: function() { return ; } }); var B = React.createClass({ contextTypes: { name: React.PropTypes.string }, render: function() { returnMy name is: {this.context.name}; } }); React.withContext({"name": "Jonas"}, function () { React.render(, document.body); });
為了減少文件的引用,你可以為contextTypes 放到一個minx 中,這樣 用到的組件引用這個 minx 就行了。
var ContextMixin = { contextTypes: { name: React.PropTypes.string.isRequired }, getName: function() { return this.context.name; } }; var A = React.createClass({ mixins: [ContextMixin], render: function() { returngetChildContextMy name is {this.getName()}; } }); React.withContext({"name": "Jonas"}, function () { // Outputs: "My name is: Jonas" React.render(, document.body); });
和訪問context 的屬性是需要通過 contextTypes 指定可訪問的 元素一樣。getChildContext 指定的傳遞給子組件的屬性需要先通過 childContextTypes 來指定,不然會產生錯誤。
// This code *does NOT work* becasue of a missing property from childContextTypes var A = React.createClass({ childContextTypes: { // fruit is not specified, and so it will not be sent to the children of A name: React.PropTypes.string.isRequired }, getChildContext: function() { return { name: "Jonas", fruit: "Banana" }; }, render: function() { return ; } }); var B = React.createClass({ contextTypes: { fruit: React.PropTypes.string.isRequired }, render: function() { returnMy favorite fruit is: {this.context.fruit}; } }); // Errors: Invariant Violation: A.getChildContext(): key "fruit" is not defined in childContextTypes. React.render(, document.body);
假設你的應用程序有多層的context。通過withContext 和 getChildContext 指定的context元素都可以被子組件引用。但是子組件是需要通過 contextTypes 來指定所需要的context 元素的。
var A = React.createClass({ childContextTypes: { fruit: React.PropTypes.string.isRequired }, getChildContext: function() { return { fruit: "Banana" }; }, render: function() { return ; } }); var B = React.createClass({ contextTypes: { name: React.PropTypes.string.isRequired, fruit: React.PropTypes.string.isRequired }, render: function() { returnMy name is: {this.context.name} and my favorite fruit is: {this.context.fruit}; } }); React.withContext({"name": "Jonas"}, function () { // Outputs: "My name is: Jonas and my favorite fruit is: Banana" React.render(, document.body); });
context 是就近引用的,如果你通過withContext 指定了context元素,然后又通過 getChildContext 指定了該元素,該元素的值將會被覆蓋。
var A = React.createClass({ childContextTypes: { name: React.PropTypes.string.isRequired }, getChildContext: function() { return { name: "Sally" }; }, render: function() { return ; } }); var B = React.createClass({ contextTypes: { name: React.PropTypes.string.isRequired }, render: function() { return總結My name is: {this.context.name}; } }); React.withContext({"name": "Jonas"}, function () { // Outputs: "My name is: Sally" React.render(, document.body); });
通過context傳遞屬性的方式可以大量減少 通過顯式的通過 props 逐層傳遞屬性的方式。這樣可以減少組件之間的直接依賴關系。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/85711.html
摘要:丟失問題文本是為了說清目前的機制是而不是我們以為的機制,并說明這兩者的區別。雖然明白了原理,但是問題并沒有解決。上下文注意這里是,需要執行接受回調函數,回調函數中的內容為實測可以成功拿到。 React context 丟失問題 文本是為了說清react context目前的機制是owner context 而不是我們以為的parent context 機制,并說明這兩者的區別。...
摘要:假如以的作用域鏈作為類比,組件提供的對象其實就好比一個提供給子組件訪問的作用域,而對象的屬性可以看成作用域上的活動對象。所以,我借鑒了作用域鏈的思路,把當成是組件的作用域來使用。 前言 Context被翻譯為上下文,在編程領域,這是一個經常會接觸到的概念,React中也有。 在React的官方文檔中,Context被歸類為高級部分(Advanced),屬于React的高級API,但官方...
摘要:我們只希望最多有兩個并發渲染器主要和次要主要和次要。輔助渲染器將自己的的存儲在單獨的字段中。 showImg(https://segmentfault.com/img/remote/1460000019911593); 前言:由于childContext在React17中會被廢棄,所以不去分析它了,主要是新 API— —createContext()的講解 一、React.create...
摘要:官方對的介紹是意思就是提供了一種通過組件樹傳遞數據的方法,而無需在每個級別手動傳遞。這也是基于重要物證哈哈實例使用學習技術最終是要有產出的。依然被視作一個組件,不過不同的是它的子組件必須是一個方法并且該方法接收當前對象并最終返回一個節點。 拋轉引玉 通過上一篇的科普我們知道如果父節點需要向子節點傳遞數據,那么就得通過Props來實現;那么擺在我們眼前的就有一個問題了:現有N個節點并且它...
前言 首先歡迎大家關注我的Github博客,也算是對我的一點鼓勵,畢竟寫東西沒法獲得變現,能堅持下去也是靠的是自己的熱情和大家的鼓勵,希望大家多多關注呀!好久已經沒寫React,發現連Context都發生了變化,忽然有一種村里剛通上的網的感覺,可能文章所提及的知識點已經算是過時了,僅僅算作是自己的學習體驗吧, Context 對于React開發者而言,Context應該是一個不陌生的概念,...
閱讀 3650·2021-10-12 10:11
閱讀 1013·2021-09-22 15:42
閱讀 3465·2019-08-30 13:06
閱讀 907·2019-08-29 17:05
閱讀 1651·2019-08-29 12:21
閱讀 2378·2019-08-29 11:31
閱讀 1136·2019-08-23 18:37
閱讀 1257·2019-08-23 14:58