加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

“React组件间通信”学习笔记

发布时间:2020-12-15 03:31:37 所属栏目:百科 来源:网络整理
导读:React没有双向通信那么自由,而是单向的,即从父组件到子组件。 父组件-子组件:props 子组件-父组件:callback 子组件-子组件:子组件通过回调改变父组件中的状态,通过props再修改另一个组件的状态 父子组件间通信 var CalendarControl = React.createClas

React没有双向通信那么自由,而是单向的,即从父组件到子组件。

  • 父组件->子组件:props

  • 子组件->父组件:callback

  • 子组件->子组件:子组件通过回调改变父组件中的状态,通过props再修改另一个组件的状态

父子组件间通信

var CalendarControl = React.createClass({
    getDefaultProps: function () {
        var newDate = new Date();
        return {
            year: util.formatDate(newDate,'yyyy'),month: parseInt(util.formatDate(newDate,'MM')),day: parseInt(util.formatDate(newDate,'dd'))
        };
    },render: function () {
        return (
            <div>
                <CalendarHeader year="this.props.year" month="this.props.month" day="this.props.day"/>
            </div>
        )
    }
});

子父组件间通信

var CalendarControl = React.createClass({
    getInitialState: function () {
        var newDate = new Date();
        return {
            year: util.formatDate(newDate,//给子组件一个回调函数,用来更新父组件的状态,然后影响另一个组件
    handleFilterUpdate: function (filterYear,filterMonth) {
        this.setState({
            year: filterYear,month: filterMonth
        });
    },render: function () {
        return (
            <div>
                <CalendarHeader updateFilter={this.handleFilterUpdate}/>
            </div>
        )
    }
});

var CalendarHeader = React.createClass({
    getInitialState: function () {
        var newDate = new Date();
        return {
            year: util.formatDate(newDate,//设置默认年为今年
            month: parseInt(util.formatDate(newDate,'MM'))//设置默认日为今天
        };
    },handleLeftClick: function () {
        var newMonth = parseInt(this.state.month) - 1;
        var year = this.state.year;
        if (newMonth < 1) {
            year--;
            newMonth = 12;
        }
        this.state.month = newMonth;
        this.state.year = year;
        this.setState(this.state);//在设置了state之后需要调用setState方法来修改状态值,
        //每次修改之后都会自动调用this.render方法,再次渲染组件
        this.props.updateFilter(year,newMonth);
    },handleRightClick: function () {
        var newMonth = parseInt(this.state.month) + 1;
        var year = this.state.year;
        if (newMonth > 12) {
            year++;
            newMonth = 1;
        }
        this.state.month = newMonth;
        this.state.year = year;
        this.setState(this.state);//在设置了state之后需要调用setState方法来修改状态值,
        //每次修改之后都会自动调用this.render方法,再次渲染组件,以此向父组件通信
        this.props.updateFilter(year,render: function () {
        return (
            <div className="headerborder">
                <p>{this.state.month}月</p>
                <p>{this.state.year}年</p>
                <p className="triangle-left" onClick={this.handleLeftClick}> </p>
                <p className="triangle-right" onClick={this.handleRightClick}> </p>
            </div>
        )
    }
});

兄弟组件间通信

var CalendarControl = React.createClass({
    getInitialState: function () {
        var newDate = new Date();
        return {
            year: util.formatDate(newDate,month: filterMonth
        });//刷新父组件状态
    },render: function () {
        return (
            <div>
                <CalendarHeader updateFilter={this.handleFilterUpdate}/>
                <CalendarBody
                    year={this.state.year}
                    month={this.state.month}
                    day={this.state.day}
                />//父组件状态被另一个子组件刷新后,这个子组件就会被刷新
            </div>
        )
    }
});

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读