React:數(shù)據(jù)流

2018-06-19 10:55 更新

在React中,數(shù)據(jù)的流向是 單向 的---從父節(jié)點(diǎn)傳遞到子節(jié)點(diǎn)。當(dāng)頂層組件的某個(gè)prop改變了, React會遞歸地向下遍歷整棵組件樹,重新渲染所有使用這個(gè)屬性的組件。

React組件內(nèi)部還具有自己的狀態(tài),這些狀態(tài)只能在組件內(nèi)修改。
我們可以將React組件看成一個(gè)函數(shù),它接受props和state作為參數(shù),返回一個(gè)虛擬的DOM表現(xiàn)。

一、Props
props properties 的縮寫,可以使用它把任意類型的數(shù)據(jù)傳遞給組件。

我們?nèi)绾卧O(shè)置組件的props?
1.可以在掛載組件時(shí)設(shè)置props:

var data=[{title:'props'}];

<MyView data={data}/>

2.調(diào)用組件實(shí)例的setProps方法(不常用):

var data=[{title:'props'}];

var myView=React.render({

  <MyView/>,

  document.body

});

myView.setProps({data:data});


注意:我們可以通過this.props訪問props,但是千萬別調(diào)用 this.setProps或者直接修改this.props。

小技巧:

var CheckLink = React.createClass({   

  render: function() {   

    // 這樣會把 CheckList 所有的 props 復(fù)制到 <a>   

    return <a {...this.props}>{'√ '}{this.props.children}</a>;   

  }  

});   

React.render(   

  <CheckLink href="/checked.html">   

    Click here!   

  </CheckLink>,   

  document.getElementById('example')  

);


PropTypes
propTypes方法是React提供的一種驗(yàn)證props的方式(一般在開發(fā)環(huán)境下才使用):

var MyView=React.createClass({

  propTypes:{

    title:React.PropTypes.isRequired,

    onClick:React.PropTypes.func

  },

  ...

});

在組件初始化時(shí),如果傳遞的屬性和propTypes不匹配,則會打印一個(gè)console.warn日志。

propTypes內(nèi)置驗(yàn)證器合集

//基本類型

React.PropTypes.array

React.PropTypes.bool

React.PropTypes.func

React.PropTypes.number

React.PropTypes.object

React.PropTypes.string


//所有可以被渲染的對象:數(shù)字,字符串,DOM元素或包含這些類型的數(shù)組。

React.PropTypes.node


//React元素

React.PropTypes.element


//用js的instanceof操作符聲明prop為類的實(shí)例

React.PropTypes.instanceOf(Object)


//用enum來限制prop只接受指定的值

React.PropTypes.oneOf(['a','b'])


//指定的多個(gè)對象類型中的一個(gè)

React.PropTypes.oneOfType([

  React.PropTypes.number,

  React.PropTypes.string

])


//指定類型組成的數(shù)組

React.PropTypes.arrayOf(React.PropTypes.number)


//指定類型的屬性構(gòu)成的對象

React.PropTypes.objectOf(React.PropTypes.number)


//特定格式參數(shù)的對象

React.PropTypes.shape({

  color:React.PropTypes.string,

  fontSize:React.PropTypes.number

})


//必需值

React.PropTypes.number.isRequired


//必需不為空的任意類型

React.PropTypes.any.isRequired




自定義驗(yàn)證器

customPropType:function(props,propName,componentName){

  if(!/[0-9]/.test(props[propName]){

    return new Error('inValid');

  }

}

注意:不要使用 console.warn 或 throw ,因?yàn)樗?oneOfType 的情況下無效。

getDefaultProps

在組件中,我們可以添加getDefaultProps函數(shù)來設(shè)置屬性的默認(rèn)值。

var MyView=React.createClass({

  getDefaultProps:function(){

    return {

      title:[]

    }

  }

});

注意:getDefaultProps并不是在組件實(shí)例化時(shí)被調(diào)用,而是在React.createClass調(diào)用時(shí)就被調(diào)用了,返回值會被緩存起來。


二、State(狀態(tài))

每一個(gè)React組件都可以擁有自己的state。


state與props的區(qū)別?

state只存在于組件的內(nèi)部。


getInitialState

我們可以用getInitialState方法來提供一組默認(rèn)值。

var MyView=React.createClass({

  getInitialState:function(){

    return {

      isShow:false

    }

  },

  render:function(){

    var view;

    if(!this.state.isShow){

      view=(

        <div className='item'>item</div>

      );

    };

    return (

      <div className='view'>{view}<button onClick={this.handleClick}>顯示</button></div>

    );

  },

  handleClick:function(){

    var isShow=!this.state.isShow;

    this.setState({

      isShow:isShow

    });

  }

});


state還可以通過 setState replaceState 修改。只要setState或replaceState被調(diào)用,render就會被調(diào)用。一旦render的返回值有變化,頁面會實(shí)時(shí)變化。


replaceState會用一個(gè)全新的state對象完整的替換掉原有的state,而setState只會將傳入的對象合并到已有的state對象中。


注意:永遠(yuǎn)不要直接修改this.state,要通過 this.setState 方法來修改。


放在state和props的各是哪些部分?

不要在state中保存計(jì)算出的值,而應(yīng)該只保存最簡單的數(shù)據(jù),即那些組件正常工作時(shí)的必要數(shù)據(jù)。

不要嘗試把props復(fù)制到state中,要盡可能把props當(dāng)做數(shù)據(jù)源。


總結(jié)

  • 使用props在整個(gè)組件樹中傳遞數(shù)據(jù)和配置
  • 避免在組件內(nèi)部修改this.props或調(diào)用this.setProps,把props看作只讀。
  • 使用props來做事件處理器,與子組件通信
  • 使用state來存儲簡單的視圖狀態(tài)
  • 使用 this.setState 來設(shè)置狀態(tài),不要使用this.state直接修改狀態(tài)。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號