React沒有雙向通訊那麼自由,而是單向的,即從父組件到子組件。javascript
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> ) } });