React入门(四)

2019-12-12  本文已影响0人  Leonard被注册了

组件通信


复合组件:父组件嵌套子组件

方案一:属性传递(适用于父与子)

       调取子组件的时候,把信息基于属性的方式传递给子组件(子组件props中存储传递的信息),这种方式只能是父组件把信息传递子组件,子组件无法直接地把信息传递给父组件,也就是说属性传递信息是单向传递的。不过利用回调函数机制也可以实现子改父的效果,即父组件把一个函数通过属性或者上下文的方式传递给子组件,子组件中只要把这个方法执行即可

/*HEAD*/
class Head extends React.Component {
    render() {
        return <div className='panel-heading'>
            <h3 className='panel-title'>
                {/*子组件通过属性获取父组件传递的状态*/}
                点击次数:{this.props.count}
            </h3>
        </div>;
    }
}

/*BODY*/
class Body extends React.Component {
    render() {
        return <div className='panel-body'>
            <button className='btn btn-success'
                    {/*子组件通过属性获取父组件传递的方法*/}
                    onClick={this.props.callBack}>点我啊!
            </button>
        </div>;
    }
}

/*PANEL*/
class Panel extends React.Component {
    constructor() {
        super();
        this.state = {n: 0};
    }

    fn = () => {
        // 修改PANEL的状态信息
        this.setState({
            n: this.state.n + 1
        });
    };

    render() {
        return <section className='panel panel-default' style={{width: '50%', margin: '20px auto'}}>
            {/*父组件中在调取子组件的时候,把信息通过属性传递给子组件*/}
            <Head count={this.state.n}/>

            {/*父组件把自己的一个方法基于属性传递给子组件,目的是在子组件中执行这个方法*/}
            <Body callBack={this.fn}/>
        </section>;
    }
}
效果演示

方案二:发布订阅方式

1.调用父组件创建一个属于自己的事件池
2.在子组件中把修改本身状态的方法放到事件池中
3.在点击按钮的时候,通知事件池中的方法执行即可

方案三:基于上下文进行传递

       父组件先把需要给后代元素(包括孙子元素)使用的信息都设置好(设置在上下文中),后代组件需要用到父组件中的信息,主动去父组件中调取使用即可

属性传递 VS 上下文传递

1.接收值的方式:属性传递时子组件通过props被动接收传递的值,而上下文传递时子组件是主动通过contextTypes挑选自己需要的值
2.值的可修改性:属性传递中父传子的属性属于只读属性,不可修改,最多只能通过defaultProps设置未传时的默认值,而上下文传递时子组件是可以修改获取到的上下文信息的(但是不会影响到父组件中的信息,其它组件不受影响)
3.后代接收方式:属性传递只能一层层地进行传递,即若想实现父传孙,则必须先父传子,再进行子传孙才可实现,而上下文传递时后代组件可以直接使用父组件设置好的上下文信息,不需要一层层进行传递
4.操作难易程度:属性传递操作起来相对方便简单,而上下文传递操作起来相对繁琐一些


平行组件:兄弟组件或者毫无关系的两个组件

方案一:让两个平行组件拥一个共同的父组件

       父组件中有一些信息,父组件把一个方法传递给A,A中把方法执行(方法执行修改父组件信息值),父组件再把最新的信息传递给B即可,等价于A操作,影响了B

方案二:Redux

进行状态统一管理的类库(适用于任何技术体系的项目)

上一篇 下一篇

猜你喜欢

热点阅读