我一直在尋找幾天,似乎無法得到這個工作,它讓我瘋了!從父母「一擊」修改孩子狀態
目標是增加「全部展開」/「全部摺疊」按鈕的手風琴。通過將propAll屬性傳遞給子組件,並通過更新componentWillReceiveProps中子組件的展開狀態,我設法讓它在某個時刻起作用,但是如果父組件設置爲在定時器上自動獲取數據,那麼它意味着子狀態被更新以在第二次獲取之後摺疊或展開所有面板,這不是所需的行爲。
class App extends React.Component {
constructor(props){
super(props);
this.state = {
"teams": [{ Name: "Liverpool", Players: ["Lovren", "Coutinho"]}, {Name:"Arsenal", Players: ["Ozil", "Welbeck"]},{Name: "Chelsea", Players: []}],
toggleAll: false,
toggleText: "Expand All"
}
}
_toggleAll(event){
event.preventDefault();
let text = "Expand All";
if (!this.state.toggleAll === true){
text = "Collapse All"
}
this.setState({toggleAll: !this.state.toggleAll, toggleText: text});
console.log("toggleAll", this.state.toggleAll);
}
render() {
return (
<div className="headers">
<button onClick={this._toggleAll.bind(this)}>{this.state.toggleText}</button>
{this.state.teams.map((team, index) =>
<Header className="" key={index} title={team.Name} players={team.Players} />
)}
</div>
);
}
}
class Header extends React.Component {
constructor(props){
super(props);
this.state = {
expanded: false
}
}
componentWillMount(){
console.log(this.props.title);
console.log(this.props.players);
}
_expand(event){
event.preventDefault();
this.setState({expanded: !this.state.expanded});
}
render() {
let players;
if(this.state.expanded)
{
players= <ul>
{this.props.players.map((player, index) => <li key={index}>{player}</li>)}
</ul>
}
return (
<div>
<div className="header" >
<p onClick={this._expand.bind(this)}>{this.props.title}</p>
</div>
{players}
</div>
);
}
}
React.ReactDOM.render(
<App />,
document.getElementById('container')
);
小提琴下面提供 https://jsfiddle.net/aamirjaffer/x52bhdq6/
您的頁眉組件不應該有'狀態'。改用道具。 –