React,通过context传递props

1,293 阅读1分钟
当组件所处层级太深时,往往需要经过很多层的props传递才能将所需的数据或者回调函数传递给使用组件。这时,以props作为桥梁的 组件通信方式便会显得很烦琐。幸好,React提供了一个context上下文,让任意层级的子组件都可以获取父组件中的状态和方法。
创建 context的方式是:在提供context的组件内新增一个getChildContext方 法,返回context对象,然后在组件的childContextTypes属性上定义 context对象的属性的类型信息。
// 提供context的父组件
class ParentComponent extends React.Component {
    // 创建context对象,包含onAddUser方法
    getChildContext() {
        return {
            onAddUser: this.handleAddUser
        };
    }
    handleAddUser() {
        // 省略
    }
    render() {
        return (
            <SonComponent />
        )
    }
}
// 声明context的属性的类型信息
 ParentComponent.childContextTypes = {       
    onAddUser: PropTypes.func     
 };
 // 相对于ParentComponent来说,任意层级的子组件
 class SonComponent extends React.Component {
    handleClick() {
        //调用this.context
        this.context.onAddUser(); 
    }
    render() {
        return (
            <button onClick={this.handleClick}>Click</button> 
        )
    }
}
 // 声明要使用的context对象的属性     
 SonComponent.contextTypes = {       
    onAddUser: PropTypes.func
 }
增加contextTypes后,在SonComponent内部就可以通过this.context.onAddUser的方式访问context中的onAddUser方法。注意,这 里的示例传递的是组件的方法,组件中的任意数据也可以通过context自动向下传递。另外,当context中包含数据时,如果要修改context中的数据,一定不能直接修改,而是要通过setState修改,组件state的变化会创建一个新的context,然后重新传递给子组件。