成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

React context 丟失問題

Seay / 1260人閱讀

摘要:丟失問題文本是為了說清目前的機制是而不是我們以為的機制,并說明這兩者的區(qū)別。雖然明白了原理,但是問題并沒有解決。上下文注意這里是,需要執(zhí)行接受回調(diào)函數(shù),回調(diào)函數(shù)中的內(nèi)容為實測可以成功拿到。

React context 丟失問題
  

文本是為了說清react context目前的機制是owner context 而不是我們以為的parent context 機制,并說明這兩者的區(qū)別。希望能對即將使用context的同學(xué)有所幫助.

什么是 context

context是為了解決component之間通信的上下文機制,該api目前并未定稿所以react并沒有開放出來。最近有大量需要共享上下文的場景才去了解這個api,然后也成功被繞了進去....
介紹與用法這篇文章Introduction to Contexts in React.js說得很清楚~

問題場景

需要在Parent中聲明context,在Children中拿到context并打印出來。

var Children = React.createClass({
  contextTypes: {
    value: React.PropTypes.string
  },
  render: function() {
    return 

{this.context.value || "并沒有context"}
; } }); var Parent = React.createClass({ childContextTypes: { value: React.PropTypes.string }, getChildContext: function() { return { value: "上下文" }; }, render: function() { return (
{this.props.children}
); } }); var App = React.createClass({ render: function() { return ( ); } }); React.render(React.createElement(App), document.body);

這樣執(zhí)行完后屏幕上應(yīng)該是『上下文』三個打字,但事實是

以及warning

那么問題來了,上下文為何失效了呢?!為什么Children拿不到Parent里面的context呢?!

find the problem

各種google之后發(fā)現(xiàn)gaearon大神在issue中的回復(fù)。

原來現(xiàn)在0.13.3版本的react context的傳遞規(guī)則是owner規(guī)則,在剛才的例子中雖然Children的parent為Parent,但是App才是Children與parent共同的owner,this.context只能拿到owner傳遞規(guī)則的context。

  

尼瑪,跟想象中的不一樣?。∧鉷rops、render的規(guī)則不都是Parent規(guī)則么!

不繼續(xù)吐槽,那么按照這個思路把context放在App上,Parent與Children應(yīng)該都能成功拿到Context了吧。

代碼是這樣的:

var Parent = React.createClass({
  contextTypes: {
    value: React.PropTypes.string
  },
  render: function() {
    return (


{this.context.value && "可算拿到了..." } {this.props.children}
); } }); var App = React.createClass({ childContextTypes: { value: React.PropTypes.string }, getChildContext: function() { return { value: "上下文" }; }, render: function() { return ( ); } }); React.render(React.createElement(App), document.body);

結(jié)果是這樣的:

看來context成功被拿到,看到這里大家應(yīng)該明白React context的機制了把。

how to get parent context

雖然明白了原理,但是問題并沒有解決。我就是希望Chilren拿到Parent中的context,而不是拿到App中的context啊。我目前一共找到了兩種方式可以在現(xiàn)階段獲取parent context。

1. use the callback

通過接收回調(diào)函數(shù)而不是react.element,然后在Parent中進行render,那么render的內(nèi)容的owner自然就是Parent了,從而可以成功拿到Parent中的context。

var Parent = React.createClass({
  childContextTypes: {
    value: React.PropTypes.string
  },
  getChildContext: function() {
    return { value: "上下文" };
  },
  render: function() {
    return (


{this.props.children() /* 注意這里是function,需要執(zhí)行 */}
); } }); // parent接受回調(diào)函數(shù),回調(diào)函數(shù)中的內(nèi)容owner為parent var App = React.createClass({ render: function() { return ( {this.renderChild} ); }, renderChild: function() { return ; } });

實測可以成功拿到context。

2.通過this._reactInternalInstance

這種方法雖然用起來很方便不過健壯性很差,等react更新之后沒準(zhǔn)又得改代碼~
可以通過this._reactInternalInstance._context.value拿到該element的parent context。this._reactInternalInstance._currentElement._context.value就是默認(rèn)的owner context。

var Children = React.createClass({
  contextTypes: {
    value: React.PropTypes.string
  },
  render: function() {
    return 

  • {"default context is: " + this.context.value}
  • {"parent context: " + this._reactInternalInstance._context.value}
  • {"owner context: " + this._reactInternalInstance._currentElement._context.value}
; } }); var Parent = React.createClass({ childContextTypes: { value: React.PropTypes.string }, getChildContext: function() { return { value: "parent" }; }, render: function() { return (
{this.props.children}
); } }); var App = React.createClass({ childContextTypes: { value: React.PropTypes.string }, getChildContext: function() { return { value: "app" }; }, render: function() { return ( ); }, }); React.render(React.createElement(App), document.body);

結(jié)果如下:

context es6 寫法

由于同事問我es6下context怎么用,想到可能有些人也不清楚,在這里一并附上。個人不推薦使用es7語法。

import React from "react";

class Children extends React.Component {

  // 如果不需要在構(gòu)造函數(shù)中使用可以不寫,沒有影響
  constructor(props, context) {
    super(props, context);
    console.log(context);
  }
  render() {
    return 

  • {"default context is: " + this.context.value}
  • {"parent context: " + this._reactInternalInstance._context.value}
  • {"owner context: " + this._reactInternalInstance._currentElement._context.value}
; } } Children.contextTypes = { value: React.PropTypes.string }; class Parent extends React.Component { getChildContext() { return { value: "parent" }; } render() { return (
{this.props.children}
); } } Parent.childContextTypes = { value: React.PropTypes.string }; class App extends React.Component { getChildContext() { return { value: "app" }; } render() { return ( ); } } App.childContextTypes = { value: React.PropTypes.string }; React.render(React.createElement(App), document.body);

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/85846.html

相關(guān)文章

  • react-dnd中context丟失解決方法

    摘要:等等這不就用的將的給覆蓋了么這也很合理的解釋了為啥會報錯了。嗯還是拿不到,想起來了,雖然將靜態(tài)屬性拿了出來,但是原型方法不會拿出來啊,所以的就沒用了,所以我們需要也將他拿出來,于是,加上一下代碼這次總算拿到正確的結(jié)果了,開心 踩坑場景 在做業(yè)務(wù)的時候,有些模塊是可以拖動的,恰好這些模塊需要從根組件App的context上拿屬性,同時App也是作為拖動上下文,被@DragDropCont...

    Arno 評論0 收藏0
  • 02.react進階指南

    摘要:指定讀取當(dāng)前的。它為其后代元素觸發(fā)額外的檢查和警告。嚴(yán)格模式檢查僅在開發(fā)模式下運行它們不會影響生產(chǎn)構(gòu)建。作用識別不安全的生命周期關(guān)于使用過時字符串的警告關(guān)于使用廢棄的方法的警告檢測意外的副作用檢測過時的為高階組件。 react 進階 懶加載 React.lazy函數(shù)能讓你像渲染常規(guī)組件一樣處理動態(tài)引入(的組件)。Suspense加載指示器為組件做優(yōu)雅降級。fallback屬性接受任何在...

    zzbo 評論0 收藏0
  • 電影天堂React Native 客戶端V2.0發(fā)布

    摘要:電影天堂客戶端重新開始具體更新以為準(zhǔn)。重新開始兩年前發(fā)布了第一個版本。最為一名偏體驗偏設(shè)計的前端開發(fā)者,對界面和用戶體驗都有極高的重視。 電影天堂React Native 客戶端 重新開始! 具體更新以https://github.com/XboxYan/DYTT為準(zhǔn)。 重新開始 兩年前發(fā)布了第一個版本。 現(xiàn)在, 使用最新的react-native 0.57和全新的設(shè)計完成了V2.0 ...

    MockingBird 評論0 收藏0
  • 探索 Redux4.0 版本迭代 論基礎(chǔ)談?wù)雇▽Ρ?React context

    摘要:在幾天前發(fā)布了新版本,被合入。但是在版本迭代的背后很多有趣的設(shè)計值得了解。參數(shù)處理這項改動由提出。對透明化處理中的,達到將包裹起來的目的。對的凍結(jié)認(rèn)為,在中使用和方法是一種反模式。尤其是這樣的新,某些開發(fā)者認(rèn)為將逐漸取代。 showImg(https://segmentfault.com/img/remote/1460000014571148); Redux 在幾天前(2018.04....

    xialong 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<