我正在使用网站的菜单。单击菜单汉堡包图标时,将出现一个悬停在菜单上的复选框。现在,我想在单击链接并转到另一个页面后隐藏菜单。但是菜单没有关闭,菜单后面的页面发生了变化,这很好。我设置了一个将复选框状态更改为false的函数,但单击链接时它不会隐藏菜单。
constructor(props) {
super(props);
this.state = {
hamburger: false
};
this.turnOff= this.turnOff.bind(this);
}
turnOff = (e) => {
this.setState({hamburger:false});
}
在render()中,我有:
<input name="hamburger" type="checkbox" id="menuToggle" onChange={this.handleChange} checked={this.state.hamburger} className="menu-toggle-input"></input>
<Link to="/about" onClick={this.turnOff}>About</Link>
当我单击链接时,它会在后台加载页面,但菜单无法关闭,并且在控制台中出现错误:
无法在未安装的组件上执行React状态更新。
答案 0 :(得分:0)
问题是这个
<Link to="/about" onClick={this.turnOff}>About</Link>
在您使用Link
的情况下,单击onClick={this.turnOff}
时,它不会等到任何关联的单击处理程序执行完毕。它将直接导航到路径为/about
的组件和您的组件unmounts
。在组件unmounts
之后,您的turnOff
函数试图更改状态,这是不可能的。
您可以使用简单的Link
(样式为链接)代替button
,
<button onClick={this.turnOff}>About</button>
您可以在setState的Redirect
中使用react-router-dom
包中的callback。
您的功能应该是
turnOff = (e) => {
this.setState({hamburger:false}, () => <Redirect to="/about" />);
}
更新
您可以使用history
对象,
turnOff = (e) => {
this.setState({hamburger:false}, () => this.props.history.push('/about'));
}
您需要从withRouter
导入react-router-dom
并将其组件包装起来。
import { withRouter } from 'react-router-dom';
export default withRouter(Your_Component_name)