【问题标题】:Reactjs- countering undefined error in referencing state sub elements in render methodsReactjs-在渲染方法中引用状态子元素时应对未定义的错误
【发布时间】:2015-12-13 17:53:48
【问题描述】:

我在以特定方式使用 React 时经常遇到问题。

我有一个组件层次结构。应用程序状态存在于公共所有者最上面的组件中。我在 getInitialState 中使用空对象或数组设置初始状态。我通过 ajax 获取数据,并在此组件的 componentDidMount 中调用此状态所有者最上层组件的方法。但是,无论我是在同一个组件中还是在子组件中使用 ajax 调用的成功回调中设置的状态,通过 props 将状态传递给它们,我几乎总是得到一个变量找不到或一些未定义的错误.

从概念上考虑,我挂载组件时调用的render方法,所以它不会在其中嵌入的变量中找到数据。但是我们有getInitialState。这似乎没问题,但如果嵌套对象正在渲染方法中使用怎么办。 getInitialState 中的状态只是空对象,因此对要成为子元素的引用是未定义的。

即使使用 componentWillMount 也不起作用。唯一的方法似乎是具有初始状态,而不是引用渲染中任何未定义的子元素。然而,在大多数情况下,这似乎是必要的。我认为与这种必要性有关的问题实际上是一种反模式吗?

在最初的教程和简单案例中,我发现 React 对我非常有用,但现在我无法有效地使用它。

如何以最佳实践正确应对这种行为?

【问题讨论】:

    标签: reactjs


    【解决方案1】:

    第一个解决方案: 我使用的方法只是检查渲染函数中是否存在状态

    render: function() {
        var result = { this.state.field ?
            this.state.field.embeddedfield ?
                <div> this.state.field.embeddedfield </div>
            : <div> Data are loading! </div>
    
          : "" }
        return {result};
    }
    

    第二个解决方案 如果您希望数据在渲染之前准备好,您需要执行第一次 fetch outside

      $.ajax({...}).success(function(res) {
             <MyView data={res} /> // render your function on success
        });
    

    看到这个:bind(this) not working on ajax success function

    回答为什么componentWillMount不起作用:将ajax调用放入componentWillMount将不起作用,因为它不会等待您的调用被获取并且还可能发生循环并发。

    【讨论】:

    • 它可能有用,但显然必须有更好的方法,这很难使用。 componentWillMount 应该可以做到。但似乎不是。我不明白为什么。
    • componentWillMount 不会调用渲染函数,因为它内部的状态发生了变化(参见文档)。另一个解决方案是使用所有嵌套对象正确定义您的初始状态。我添加了同样的问题,但没有找到更好的方法,实际上我在 SO 上问了同样的问题,询问是否有更轻松的方法,但人们证实他们确实是这样做的。也许你会很幸运并找到一个更好的答案(我会对此非常感兴趣!)但现在我认为没有其他办法。为了使其更简洁,您仍然可以在函数中检查状态,但从概念上讲就是这样。
    • 我不是说componentWillMount会调用render函数。每当状态发生变化时,都会愉快地调用 render 函数,例如在 componentWillMount 或 componentDidMount 中。我的意思是 componentWillMount 确保尚未调用渲染,因此我可以获取数据并确保数据在其所有结构、嵌套等被调用之前已准备好用于渲染函数。这就是 componentWillMount 的文档中的含义.但我不明白为什么我不能让它工作。
    • 再一次为了在状态改变时调用渲染,一个 setInterval 很容易在 componentDidMount 中单独调用。这是另一回事。
    • 所以第一个解决方案是检查数据是否已到达,第二个解决方案是在您确定数据在这里时呈现。我怀疑是否有任何其他解决方案,但如果你找到一个请告诉我,因为我已经挖掘了这个问题一点点。
    猜你喜欢
    • 1970-01-01
    • 2020-06-04
    • 2020-10-09
    • 2017-10-25
    • 1970-01-01
    • 2018-03-29
    • 1970-01-01
    • 1970-01-01
    • 2021-05-22
    相关资源
    最近更新 更多