【发布时间】:2019-11-23 11:02:08
【问题描述】:
在浏览了包括 Stackoverflow 在内的各种网站之后,我终于弄清楚了如何将状态从子级传递给父级。我必须做两次,因为我的结构是:
<NavButtons>孩子
<Nav>家长
<App>祖父母
想法是将点击事件转换为<NavButtons>中的字符串,将该字符串保存到状态,将状态传递给<Nav>,然后再次将其传递给<App>,它将使用该字符串来更新看法。
问题是,虽然子状态在单击时立即更新,但父状态仅在再次单击后更新,然后祖父状态仅在再次单击后更新。这似乎是非常奇怪的行为,我似乎无法在任何地方找到解决方案。我觉得这可能是由于我对生命周期方法中事情发生的顺序理解不足。
导航按钮(子)
class NavButtons extends React.Component {
constructor(props) {
super(props);
this.state = { active: "" };
this.handleClick = this.handleClick.bind(this);
}
handleClick(num) {
const btnArr = ["overview", "movement", "distribution"];
this.setState({ active: btnArr[num] });
this.props.getState(this.state.active);
}
render() {
console.log("child says " + this.state.active);
return (
<div className="button-container">
<ul className="nav-buttons">
<li className="overview" onClick={() => this.handleClick(0)}>
Overview
</li>
<li className="movement" onClick={() => this.handleClick(1)}>
Movement
</li>
<li className="distribution" onClick={() => this.handleClick(2)}>
Distribution
</li>
</ul>
</div>
);
}
}
导航(父级)
class Nav extends React.Component {
constructor(props) {
super(props);
this.state = { navState: "" };
this.passNavState = this.passNavState.bind(this);
}
passNavState(nav) {
this.setState({ navState: nav });
this.props.NavStateUpdate(this.state.navState);
}
render() {
console.log("parent says "+this.state.navState)
return (
<div className="nav-container">
<img src={Logo} alt="Tharsus logo" />
<NavButtons getState={this.passNavState} />
<DatePicker />
</div>
);
}
}
应用(祖父母)
class App extends React.Component {
constructor() {
super();
this.state = {
appDate: moment().format("1995-12-25", "YYYY-MM-DD"),
apiData: "",
navState: ""
};
this.getNavState = this.getNavState.bind(this);
}
getNavState(nav) {
this.setState({ navState: nav });
}
componentDidMount() {
const requestData = axios({
url: "https://tharsus-interview-api-v1.azurewebsites.net/data/2019-10-19",
method: "get",
headers: {
"content-type": "application/json"
}
})
.then(response => {
this.setState({ apiData: response });
})
.catch(err => {
console.log(err);
});
}
render() {
console.log("grandparent says " + this.state.navState);
return (
<div className="App">
<Nav NavStateUpdate={this.getNavState} />
{this.state.navState === "movement" ? (
<div className="chart-container">
<MovementDataDisplay
Data={[3.3176110809420893, 4.18238891905791]}
Title="Site Hours"
/>
<MovementDataDisplay
Data={[3.9176110809420893, 4.18238891905791]}
Title="Moving Hours"
/>
</div>
) : (
" "
)}
</div>
);
}
}
【问题讨论】:
标签: reactjs input event-handling parent-child lag