我正在开发React + Meteor应用程序,但我在使用用户登录功能时遇到了问题。
我有一个标题导航栏,根据用户是否登录显示不同的组件。
像这样:
export default class Header extends Component {
constructor(props) {
super(props)
this.state = {
user: Meteor.user()
}
}
render() {
return (
<header className="main-header">
<nav className="navbar navbar-static-top">
<div className="navbar-custom-menu">
{this.state.user() !== null ? <LoggedInNavigation /> : <LoggedOutNavigation />}
</div>
</nav>
</header>
)
}
}
现在这样可行,但在用户登录时不会改变。我必须刷新页面才能更改视图(这显然不太理想)。
这是我的登录代码:
Meteor.loginWithPassword(this.state.email, this.state.password, (error) => {
if (error)
this.setState({ meteorError: "Error: " + error.reason })
else {
this.setState({ meteorError: "" })
// Handle successful login
}
})
问题是这两个代码块位于不同的组件中。
第一个块位于imports/ui/components/main-layout/Header
,第二个块位于imports/ui/components/authentication/Login
。
正如我所说,问题是用户可以登录但视图不会根据身份验证状态而改变。解决这个问题的最佳做法是什么?
修改
以下是组件的层次结构:
1 - LoggedOutNav
MainLayout -> Header -> LoggedOutNav
2 - 登录代码
MainLayout -> Routes -> (Route path="/login" component={Login}) -> LoginForm
答案 0 :(得分:1)
这里的问题是,只要组件已挂载,类的构造函数将只运行一次而不会再运行一次。因此即使>>> l = ['11100', '11010', '11001', '10110',
'10101', '10011', '01110', '01101',
'01011', '00111']
>>> new_list = [[int(i) for i in j] for j in l]
>>> print(new_list)
[[1, 1, 1, 0, 0],
[1, 1, 0, 1, 0],
[1, 1, 0, 0, 1],
[1, 0, 1, 1, 0],
[1, 0, 1, 0, 1],
[1, 0, 0, 1, 1],
[0, 1, 1, 1, 0],
[0, 1, 1, 0, 1],
[0, 1, 0, 1, 1],
[0, 0, 1, 1, 1]]
会发生变化,您的Meteor.user()
也不会发生变化。当a)state
更改或b)您的props
更改时,该组件将会重新呈现当你致电state
时。我们可以利用a)通过流星setState
HOC(react-meteor-data)来包装你的createContainer
类,并为它设置一个被动数据上下文。当数据发生变化时,Header
的道具会发生变化,组件会重新渲染。代码类似于:
Header