reactjs - 如何成功地将一个组件的状态从另一个更改?
问题描述
我在另一个组件的 onClick 函数中的一个组件中调用 setState,但它说 this.setState 不是函数,并且组件在 componentWill 更新中重复调用 setState。我该如何解决?这是 app.js 文件的相关内容:export default class App extends React.Component {
constructor(props) {
super(props);
this.state = {
activeScreen: 'dashboard'
}
}
setActiveScreen(key) {
this.setState({
activeScreen: key
})
}
render() {
return (
<NavBar activeScreen={this.state.activeScreen} setActiveScreen={this.setActiveScreen} />
)
}
这是导航栏组件的相关部分:
class NavBar extends Component {
render() {
return (
<li className="nav-item" key={key}>
<Link className={`nav-link ${this.props.activeScreen == i.key ? 'active' : ''}`} to={i.to} onClick={() => {this.props.setActiveScreen(i.key)}}>
{i.label}
</Link>
</li>
)
}
解决方案
您必须将setActiveScreen
函数绑定到this
App 组件的构造函数中。
像这样:
constructor(props) {
super(props);
this.state = {
activeScreen: 'dashboard'
}
this.setActiveScreen = this.setActiveScreen.bind(this);
}
或者,正如@Nico 在评论中所说,使用箭头功能。
像这样:
setActiveScreen = key => {
// logic
}
推荐阅读
- php - 与 Eloquent/Laravel 的复杂关系
- docker - Log file not created in a .NET Core application running in a Docker container
- laravel - Laravel 多态关系范围按枢轴字段
- saml-2.0 - SAML 中的 IDP 启动流是否支持 HTTP-POST 和 HTTP-Redirect 绑定,如果支持,IDP 启动流的实际流将如何?
- visual-studio-code - 寻找用于 i18n 资源包编辑的 Visual Studio 代码扩展
- python - 我如何获得桌面应用程序的当前焦点元素
- vue.js - Nativescript-Vue:如何在 ListView 中正确使用 v-for
- ruby-on-rails - 尽管有 Rack::Cors,但请求仍会影响生产 Rails API
- scala - 让 OpenJDK 9+ 真正工作的 ScalaFX 背后有什么魔力?
- javascript - 如何从 nextjs 中的自定义服务器 console.log