编辑:查看 git 存储库以获取最小示例: https ://github.com/maximilianschmitt/blind-lifecycle
我有一个组件RequireUser
试图确保用户已登录,否则不会呈现其子级。它的父组件App
应该知道是否需要用户并在需要时呈现登录表单。
问题是,组件在App
组件之后安装RequireUser
在树中,如下所示:
App
RequireUser
SomeOtherComponent
在RequireUser
's中componentDidMount
,我正在触发一个requireLogin
将UserStore
'sloginRequired
变量设置为true
.
这不会更新父组件 ( App
),因为它尚未安装,因此无法注册对存储的更改。
class RequireUser extends React.Component {
constructor() {
super();
this.state = alt.stores.UserStore.getState();
}
componentDidMount() {
this.unlisten = alt.stores.UserStore.listen(this.setState.bind(this));
if (!this.state.requireUser) {
UserActions.requireUser();
// using setTimeout will work:
// setTimeout(() => UserActions.requireUser());
}
}
componentWillUnmount() {
this.unlisten();
}
render() {
if (this.state.requireUser) {
return <div>I have required your user</div>;
}
return <div>I will require your user</div>;
}
}
class App extends React.Component {
constructor() {
super();
this.state = alt.stores.UserStore.getState();
}
componentDidMount() {
this.unlisten = alt.stores.UserStore.listen(this.setState.bind(this));
}
componentWillUnmount() {
this.unlisten();
}
render() {
return (
<div>
<div>User required? {this.state.requireUser + ''}</div>
<RequireUser />
</div>
);
}
}
输出:
需要用户吗?错误的
我需要你的用户
如果我使用setTimeout
in RequireUser
,App
接收状态更改并呈现,但仅在闪烁之后:
需要用户吗?真的
我需要你的用户
我觉得我正在做的是一种反模式,我将不胜感激提供比使用 setTimeout 闪烁更优雅的解决方案的建议。谢谢!