数据流

props和state

props

在React中,数据的流向是单向的,从父节点传递到子节点,子节点组件从父节点获取props,进行渲染。如果顶层组件的某个prop改变了,React会递归向下遍历整颗组件树,重新渲染所有使用这个属性的组件。

state

React的每个组件内部都有自己的状态,这些状态只能在组件内修改。

总结

  • 使用props在整个组件树中传递数据和配置
  • 避免在组件内部修改this.props或调用this.setProps,把props当作是只读的
  • 使用props来做事件处理器,与子组件通信
  • 使用state存储简单的视图状态,比如说下拉框是否可见这样的状态
  • 使用this.setState来设置状态,而不要使用this.state直接修改状态

Props

在挂载组件的时候,设置组件的props

var surveys = [{title : 'Superheroes'}];
<ListSurveys surveys={surveys} />
var SaveButton = React.createElement({
    handleClick : function(){},
    render : function() {
        return (
            <a className='button save' onClick={this.handleClick}>Save</a>
        );
    }
})

PropTypes

通过在组件中定义一个配置对象,React提供一个验证props的方式

var SurveyTableRow = React.createElement({
    propTypes : {
        survey : React.PropTypes.shape({
            id : React.PropTypes.number.isRequired
            }).isRequired,
        onClick : React.PropTypes.func
    }
})

getDefaultProps

getDefaultProps并不是在组件实例化时被调用,而是在React.createClass调用时就被调用了,返回值会被缓存起来。

var SurveyTable = React.createClass({
    getDefaultProps : function() {
        return {
            surveys : []
        }
    }
});

state

state与props的区别在于前者只存在于组件的内部

state可以用来确定一个元素的视图状态

var CountryDropDown = React.createElement({
    getInitialState : function() {
        return {
            showOptions : false
        };
    },
    handleClick : function() {
        this.setState({
            showOptions : true
        });
    },
    render : function() {
        var options;

        if(this.state.showOptions){
            options = (
                <ul className='options'>
                    <li>United States of America</li>
                    <li>New Zealand</li>
                    <li>Denmark</li>
                </ul>
            );
        }

        return (
            <div className="dropdown" onClick={this.handleClick}>
                <label>Choose a country</label>.{options}
            </div>
        );
    }
});

results matching ""

    No results matching ""