成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

少婦白潔如何使用React 001?

davidac / 4277人閱讀

摘要:目的是為了解決在重用的時(shí)候,持久和方法重用的問題。換句話說你不用擔(dān)心把組件寫成模式不好重用,如果你需要傳統(tǒng)的方式使用,一下即可。

這篇文章所述的思想最終進(jìn)化成了一個(gè)簡(jiǎn)單的狀態(tài)管理模式,稱React StateUp Pattern,詳細(xì)介紹請(qǐng)參閱:https://segmentfault.com/a/11...

寫了一個(gè)非常簡(jiǎn)單的實(shí)驗(yàn)性Pattern,暫且稱為PurifiedComponent。目的是為了解決React Component在重用的時(shí)候,state持久和方法重用的問題。

React組件和state的生命周期不一致,即使是在一個(gè)對(duì)話框內(nèi),也可能因?yàn)檎郫B或者平移,一些組件消失但是他們的state還需要持久;這種情況下在this.state內(nèi)存放狀態(tài)并不能解決問題,因?yàn)槿绻@個(gè)組件在渲染時(shí)消失了,它的state也沒了;

React官方的說法是應(yīng)該把state寫到相關(guān)組件的共同祖先上去,這一點(diǎn)在實(shí)現(xiàn)邏輯上本身沒有問題,有問題的地方是重用很不方便;很多view state,例如和輸入框配合的校驗(yàn)函數(shù)或者出錯(cuò)信息,他們本身就應(yīng)該是和組件一起使用的,離開組件去多帶帶維護(hù)沒有意義;

解決這個(gè)問題的思路是,把組件需要的view state獨(dú)立構(gòu)建對(duì)象;持久化state的責(zé)任,托管到父組件去,但是對(duì)組件操作的責(zé)任,仍然留在子組件內(nèi),換句話說,子組件和它的state是由父組件bind在一起的。

class PurifiedComponent extends React.PureComponent {

  setState(props) {
    let { state, name, setState } = this.props
    setState({ [name] : Object.assign(new state.constructor(), state, props) })
  }
}

class Impure extends React.Component {

  constructor(props) {
    super()
    this.state = { state: new props.component.State() }
  }

  render() {
    let Component = this.props.component
    return 
  }
}

上面的兩個(gè)class是基礎(chǔ)類;PurifiedComponent在React.PureComponent基礎(chǔ)上實(shí)現(xiàn)了一個(gè)setState方法。

使用方式看下面的例子,Child1是一個(gè)獨(dú)立PurifiedComponent的例子,Composite是組合的例子;

繼承自PurifiedComponent的類需要提供一個(gè)靜態(tài)類變量State,它是一個(gè)class;這個(gè)類是用于描述狀態(tài)的類,即所謂的view state;它也應(yīng)該具有行為,尤其是那些計(jì)算computed的方法,對(duì)父組件來說可以直接訪問;

PurifiedComponent不在類結(jié)構(gòu)內(nèi)維護(hù)state,即不使用this.state;創(chuàng)建和保存它的state是它的父容器的職責(zé);父容器可以通過new Child1.State()創(chuàng)建這個(gè)state;這是第一個(gè)約定;

第二個(gè)約定是,這些類需要有三個(gè)props:

state,從外部傳入的state;

name,state在父容器組件的state內(nèi)的property name;

setState,父容器的setState方法;

有了這三者后,子組件就可以做stateful的工作,用傳入的state和setState工作;name原則來說不是邏輯需要的,但可以結(jié)合PureComponent避免不必要的刷新。

class Child1 extends PurifiedComponent {

  static State = class State {
    constructor() {
      this.label = ""
    }
  }

  render() {

    let {state, name} = this.props
    console.log(`render ${name}`)

    return (
      
) } }

Composite是一個(gè)組合,目前沒有設(shè)計(jì)使用數(shù)組組合的方式,只看看用Property Name來組合的辦法,這個(gè)Composite和它的子組件一樣沒有使用自己的this.state,這顯示了這種Pattern是可以自下而上組成樹的;

Composite的構(gòu)造函數(shù)里有一個(gè)this.ssb,它表示的是bound函數(shù),之所以在對(duì)象上創(chuàng)建是為了保持它的引用穩(wěn)定,這樣在向child傳遞三個(gè)參數(shù)時(shí),setState和name都是恒定的,只有第一個(gè)state變化時(shí)子組件會(huì)重新渲染;這是我們需要的特性;

class Composite extends PurifiedComponent {

  static State = class State {
    constructor() {
      this.child1 = new Child1.State()
      this.child2 = new Child1.State()
    }
  }

  constructor() {
    super()
    this.ssb = this.setState.bind(this)
  }

  render() {
    return (
      
) } } class App extends Component { render() { return } } export default App

最后的Impure是一鍵攔截這種層層向上提升state holder的行為,它可以作為一個(gè)stateful的組件,用它的this.state來裝載所有內(nèi)含的PurifiedComponent構(gòu)成的樹。換句話說你不用擔(dān)心把組件寫成Purified模式不好重用,如果你需要傳統(tǒng)的方式使用,Impure一下即可。

上述代碼雖然簡(jiǎn)單但是可以工作,我會(huì)在生產(chǎn)環(huán)境中嘗試一下。

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/88168.html

相關(guān)文章

  • 少婦白潔系列之React StateUp模式

    摘要:一般這種情況會(huì)在類的構(gòu)造函數(shù)內(nèi)創(chuàng)建一個(gè)屬性,引用或詞法域的,但后面會(huì)看到我們有更好的辦法,避免這種手工代碼。 換句話說,StateUp模式把面向?qū)ο蟮脑O(shè)計(jì)方法應(yīng)用到了狀態(tài)對(duì)象的管理上,在遵循React的組件化機(jī)制和基于props實(shí)現(xiàn)組件通訊方式的前提之下做到了這一點(diǎn)。 ---- 少婦白潔 閱讀本文之前,請(qǐng)確定你讀過React的官方文檔中關(guān)于Lifting State Up的論述: ht...

    jaysun 評(píng)論0 收藏0
  • 少婦白潔系列之React StateUp Pattern, Explained

    摘要:本文用于闡述模式的算法和數(shù)學(xué)背景,以及解釋了它為什么是里最完美的狀態(tài)管理實(shí)現(xiàn)。歡迎大家討論和發(fā)表意見。 本文用于闡述StateUp模式的算法和數(shù)學(xué)背景,以及解釋了它為什么是React里最完美的狀態(tài)管理實(shí)現(xiàn)。 關(guān)于StateUp模式請(qǐng)參閱:https://segmentfault.com/a/11... P-State, V-State 如果要做組件的態(tài)封裝,從組件內(nèi)部看,存在兩種不同的...

    20171112 評(píng)論0 收藏0
  • 少婦白潔一起學(xué)JavaScript之Async/Await

    摘要:匿名函數(shù)是我們喜歡的一個(gè)重要原因,也是,它們分別消除了很多代碼細(xì)節(jié)上需要命名變量名或函數(shù)名的需要。這個(gè)匿名函數(shù)內(nèi),有更多的操作,根據(jù)的結(jié)果針對(duì)目錄和文件做了不同處理,而且有遞歸。 能和微博上的 @響馬 (fibjs作者)掰扯這個(gè)問題是我的榮幸。 事情緣起于知乎上的一個(gè)熱貼,諸神都發(fā)表了意見: https://www.zhihu.com/questio... 這一篇不是要說明白什么是as...

    Bryan 評(píng)論0 收藏0
  • 少婦白潔一起學(xué)JavaScript之Async/Await II

    摘要:的科學(xué)定義是或者,它的標(biāo)志性原語是。能解決一類對(duì)語言的實(shí)現(xiàn)來說特別無力的狀態(tài)機(jī)模型流程即狀態(tài)。容易實(shí)現(xiàn)是需要和的一個(gè)重要原因。 前面寫了一篇,寫的很粗,這篇講講一些細(xì)節(jié)。實(shí)際上Fiber/Coroutine vs Async/Await之爭(zhēng)不是一個(gè)簡(jiǎn)單的continuation如何實(shí)現(xiàn)的問題,而是兩個(gè)完全不同的problem和solution domain。 Event Model 我...

    番茄西紅柿 評(píng)論0 收藏0
  • 少婦白潔一起學(xué)JavaScript

    摘要:我們已經(jīng)回答了的構(gòu)造函數(shù)和原型都是誰的問題,現(xiàn)在牽扯出來一個(gè),我們繼續(xù)檢查的構(gòu)造函數(shù)是全局對(duì)象上屬性叫的對(duì)象的原型是個(gè)匿名函數(shù),按照關(guān)于構(gòu)造函數(shù)的約定,它應(yīng)該是構(gòu)造函數(shù)的屬性我們給這個(gè)對(duì)象起個(gè)名字,叫。 我不確定JavaScript語言是否應(yīng)該被稱為Object-Oriented,因?yàn)镺bject Oriented是一組語言特性、編程模式、和設(shè)計(jì)與工程方法的籠統(tǒng)稱謂,沒有一個(gè)詳盡和大家...

    DevTTL 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<