React 组件渲染问题

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Hello World</title>
    <script src="http://cdn.bootcss.com/react/15.6.1/react.min.js"></script>
    <script src="http://cdn.bootcss.com/react/15.6.1/react-dom.min.js"></script>
    <script src="http://cdn.bootcss.com/babel-core/5.8.38/browser.min.js"></script>
<body>
    <div id="app"></div>
</body>
<script type="text/babel">

    class App extends React.Component {
        render() {
            return (
                <div className="notificationsFrame">
                    <div className="panel">
                        <Content activities={activities} />
                    </div>
                </div>
            )
        }
    }

    class Content extends React.Component {
        render() {
            const {activities} = this.props;

            return (
                <div className="content">
                    <div className="line"></div>
                {activities.map((activity) => {
                {/* 无法渲染 */}
                    <ActivityItem 
                        activity={activity} />
                })}
                </div>
            )
        }
    }

    class ActivityItem extends React.Component {
        render() {
            const {activity} = this.props;

             return (
                 <div className="item">
                    <div className="avatar">
                        <img src={activity.user.avatar} />
                        {activity.user.name}
                    </div>
                    
                    <span className="time">
                        {activity.timestamp}
                    </span>
                    <p>{activity.text}</p>
                    <div className="commentCount">
                        {activity.comments.length}
                    </div>
                </div>
            )
        }
    }

    const activities = [
        {
            timestamp: new Date().getTime(),
            text: "Ate lunch",
            user: {
            id: 1, name: 'Nate',
            avatar: "http://www.croop.cl/UI/twitter/images/doug.jpg"
            },
            comments: [{ from: 'Ari', text: 'Me too!' }]
        },
        {
            timestamp: new Date().getTime(),
            text: "Woke up early for a beautiful run",
            user: {
            id: 2, name: 'Ari',
            avatar: "http://www.croop.cl/UI/twitter/images/doug.jpg"
            },
            comments: [{ from: 'Nate', text: 'I am so jealous' }]
        },
    ]

    var mount = document.querySelector('#app');
    ReactDOM.render(<App />, mount);
</script>

</html>

通过上面的代码浏览器不渲染,不报错。
但不抽离 ActivityItem 组件,直接在 Content 组件中渲染,是OK的。

class Content extends React.Component {
    render() {
        const {activities} = this.props;

        return (
            <div className="content">
                <div className="line"></div>
            {activities.map((activity) => {
                return (
                    <div className="item">
                        <div className="avatar">
                            <img src={activity.user.avatar} />
                            {activity.user.name}
                        </div>
                        
                        <span className="time">
                            {activity.timestamp}
                        </span>
                        <p>{activity.text}</p>
                        <div className="commentCount">
                            {activity.comments.length}
                        </div>
                    </div>
                )
            })}
            </div>
        )
    }
}

请问各位老司机,问题出在哪里?

阅读 2.1k
2 个回答

么有return 还有没有key
class Content extends React.Component {

    render() {
        const {activities} = this.props;

        return (
            <div className="content">
                <div className="line"></div>
            {activities.map((activity, index) => {
            /* 无法渲染 */
                return <ActivityItem activity={activity} key={index}/>
            })}
            </div>
        )
    }
}

map的语法错误,如果方法体只有一句代码,在方法体不用大括号包起来时,会自动返回该语句的执行结果,如:

{activities.map((activity) => 
    <ActivityItem activity={activity} />
)}

你现在是加了大括号,所以需要显式return:

{activities.map((activity) => {
   return <ActivityItem activity={activity} />
})}

另外提醒,不要忘了给ActivityItem加上key

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题