「React組件間通訊」學習筆記

React沒有雙向通訊那麼自由,而是單向的,即從父組件到子組件。javascript

  • 父組件->子組件: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, 'yyyy'),
            month: parseInt(util.formatDate(newDate, 'MM')),
            day: parseInt(util.formatDate(newDate, 'dd'))
        };
    },
    //給子組件一個回調函數,用來更新父組件的狀態,而後影響另外一個組件
    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, 'yyyy'),//設置默認年爲今年
            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,newMonth);
    },

    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, 'yyyy'),
            month: parseInt(util.formatDate(newDate, 'MM')),
            day: parseInt(util.formatDate(newDate, 'dd'))
        };
    },
    //給子組件一個回調函數,用來更新父組件的狀態,而後影響另外一個組件
    handleFilterUpdate: function (filterYear, filterMonth) {
        this.setState({
            year: filterYear,
            month: filterMonth
        });//刷新父組件狀態
    },
    render: function () {
        return (
            <div>
                <CalendarHeader updateFilter={this.handleFilterUpdate}/>
                <CalendarBody
                    year={this.state.year}
                    month={this.state.month}
                    day={this.state.day}
                />//父組件狀態被另外一個子組件刷新後,這個子組件就會被刷新
            </div>
        )
    }
});
相關文章
相關標籤/搜索