【问题标题】:Array of react elements not rendering in the render()未在 render() 中渲染的反应元素数组
【发布时间】:2016-03-03 00:48:10
【问题描述】:

我正在通过使用 Meteor 创建一些示例项目来学习反应。我想我已经掌握了它,但现在我又被卡住了。

我正在使用 twitter API 从 BOINGBOING twitter 页面获取最近的 3 条推文。我可以确认我的 API 正常工作,并且可以控制包含 created_attextvalue.entities.media[0].media_url 的对象数组,这基本上是推文的图像 url。

我想要实现的是在包含 img 和 2 个 p 标记的 div 标记内显示三个推文。

我正在使用 JSX 构建 DOM,将当前推文的 DOM 推送到一个数组中,然后将该数组传递给 render()。我认为一组 React 元素应该呈现正确吗?那么我的错误是什么,我什么也没看到?

getTweets: function(){

    Meteor.call('fetchTweets', function(error, result){
        var res = [];

        // cycle through the results and build reat elements
        _.each(result, function(value, key, list){
            var {created_at, text, ...other} = value;

            if (value.entities.media != undefined) {
                // no image
                let node = (
                    <div>
                        <p>{created_at}</p>
                        <p>{text}</p>
                    </div>                        
                    );
                console.log(node);
                res.push(node);

            } else {
                // has image
                let node = (
                    <div>
                        <img src={value.entities.media[0].media_url} alt=""/>
                        <p>{created_at}</p>
                        <p>{text}</p>
                    </div>                        
                );
                res.push(node);

            }
        })
        console.log(res);
        return res;          

    });        
},

render: function() {

    return (
        <div>
            <div className="alltweets">{this.getTweets()}</div>
        </div>          
    );
}

当我消除我的反应元素时,这就是我所看到的。

【问题讨论】:

  • 什么是渲染?另外,在渲染数组时,需要手动给组件一个key 属性(可以设置为循环的索引)
  • @PhilVarg 我会试试这个
  • 我们真的需要看到更多。你如何将它呈现给dom?我看不到您通过模板帮助程序、初始化程序或任何其他附加到 dom 的方式注入它的任何地方。此外,典型的反应元素开始时大不相同,我将发布一个答案来说明这一点。
  • @thatgibbyguy 我正在使用{this.getTweets()} 进行渲染 -> 请参阅帖子末尾的控制台输出,我在另一个示例中看到过这种方式。

标签: javascript meteor reactjs


【解决方案1】:

我不知道meteor,但是看起来Meteor.call是异步的,所以不能只返回res。您可能需要在您的 asyncCallback 中调用 setState({ someKey: res }),并在您的 render() 调用中使用该状态。

【讨论】:

  • true 但我在 Meteor.call 中返回 res。我尝试设置状态,但这返回了奇怪的错误。
  • @KevinQi 我正在使用带有回调函数的Meteor.call,我只在这个回调中返回res
  • @ThaiTran 我看到了Error: Invariant Violation: Test.getInitialState(): must return an object or null
【解决方案2】:

我不确定您在这种情况下是否正确使用了 react,这就是我的做法。

const TweetList = React.createClass({


    getInitialState() {
        const tweets = Meteor.call('fetchTweets', function(error, result){ 
            return result;
        }
        return { 
            tweets: tweets
        }
    },

    render() {
        const {tweets} = this.state;
        {data.map(this._renderTweets)}
    },

    _renderTweets(tweet, ii) {
        if (!tweet.entities.media) {
            return(
                <div key={ii}>
                    <p>{tweet.created_at}</p>
                    <p>{tweet.text}</p>
                </div> 
            );
        }
        else {
            return(
                <div key={ii}>
                    <img src={tweet.entities.media.media_url} alt=""/>
                    <p>{tweet.created_at}</p>
                    <p>{tweet.text}</p>
                </div> 
            );
        }
    }
});

然后你会将它渲染到 DOM。

【讨论】:

  • 看起来和我的不太一样。我没有看到getInitialState 使用这种方式,看起来你没有设置this.state,我虽然getInitialState 必须返回一个对象?不过我会试一试,谢谢
  • 你说得对,this.data 应该是this.state。我已经编辑过了。
  • 或许看看sascha刚刚发的这篇文章吧。 discovermeteor.com/blog/data-loading-react
  • 我让代码工作了。问题是我的上下文搞砸了,即不能在回调函数中setState。在我找到一个很酷的解决方案之前,我的解决方案仍然是意大利面条代码。谢谢你的链接,这里给你一个:medium.com/meteor-js/…
  • 你的解决方案也不起作用,getInitialState 应该是一个对象。您的代码返回 null
猜你喜欢
  • 1970-01-01
  • 2020-02-20
  • 1970-01-01
  • 1970-01-01
  • 2017-12-13
  • 2020-10-06
  • 2019-11-14
  • 1970-01-01
  • 2017-10-14
相关资源
最近更新 更多