【发布时间】:2020-08-07 03:40:15
【问题描述】:
我在这个应用程序中使用 Meteor 1.3 以及 react js 和 Tracker React。 我有一个页面可以查看应用程序中的所有可用用户。此页面需要用户登录才能查看数据。如果用户未登录,它将显示登录表单,一旦登录,组件将呈现用户的数据。
逻辑的主要组件。
export default class MainLayout extends TrackerReact(React.Component) {
isLogin() {
return Meteor.userId() ? true : false
}
render() {
if(!this.isLogin()){
return (<Login />)
}else{
return (
<div className="container">
<AllUserdata />
</div>
)
}
}
}
在AllUserdata 组件中:
export default class Users extends TrackerReact(React.Component) {
constructor() {
super();
this.state ={
subscription: {
Allusers : Meteor.subscribe("AllUsers")
}
}
}
componentWillUnmount(){
this.state.subscription.Allusers.stop();
}
allusers() {
return Meteor.users.find().fetch();
}
render() {
console.log('User objects ' + this.allusers());
return (
<div className="row">
{
this.allusers().map( (user, index)=> {
return <UserSinlge key={user._id} user={user} index={index + 1}/>
})
}
</div>
)
}
};
问题是登录时,它只显示当前用户的数据。不呈现所有其他用户对象。如果我在控制台上查看,console.log('User objects ' + this.allusers()); 显示正在渲染 3 次的对象:第一次渲染仅显示当前用户的数据,第二次渲染所有用户的数据(所需的结果),第三次再次渲染仅当前用户数据。
如果我刷新页面,用户数据将正确呈现。
知道为什么吗?
【问题讨论】:
-
我有一个非常相似的问题,我们都遵循了 TrackerReact 示例的代码模式(即在类中定义一个从订阅集合返回数据的方法,然后 .map 在渲染方法)。我看到你已经接受了下面的答案,但它似乎并没有解决问题,只是告诉你用其他方式去做——这违背了 TrackerReact 在其自己的演示中显示的代码模式?!
标签: javascript meteor reactjs es5-shim