【问题标题】:React JS component renders multiple times in MeteorReact JS 组件在 Meteor 中多次渲染
【发布时间】: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


【解决方案1】:

React 在运行时多次调用组件的render() 方法。如果您遇到意外的调用,通常是某些事情触发了对您的组件的更改并启动了重新渲染。似乎有些东西可能会覆盖对Meteor.users.find().fetch() 的调用,这可能是因为您在每次渲染时都调用了该函数。尝试检查 render 方法的 outside 值,或者更好的是,依靠测试来确保你的组件正在做它应该做的事情:)

来自https://facebook.github.io/react/docs/component-specs.html#render

render() 函数应该是纯的,这意味着它不会修改组件状态,每次调用它都会返回相同的结果,并且它不会读取或写入 DOM 或以其他方式与浏览器交互(例如, 通过使用 setTimeout)。如果您需要与浏览器交互,请在 componentDidMount() 或其他生命周期方法中执行您的工作。保持 render() 的纯净使服务器渲染更实用,并使组件更容易思考。

另见:

【讨论】:

  • 我不明白如何检查渲染方法之外的值。我当前的解决方案是在用户成功登录后重新加载页面。这不是完美的,但这是我目前唯一能想到的。
  • 您可以在自定义方法或任何一种生命周期方法中轻松检查数据(尽管并非所有方法都一定会为您提供所需的内容)。最好的方法是通过 React devtools -> github.com/facebook/react-devtools
猜你喜欢
  • 1970-01-01
  • 2020-03-22
  • 2017-07-23
  • 2019-05-26
  • 2016-08-03
  • 1970-01-01
  • 2016-01-11
  • 1970-01-01
  • 2021-04-04
相关资源
最近更新 更多