【全栈React】第5天: 数据驱动
我们的应用程序中的硬编码数据不是好主意。 今天,我们将把我们的组件设置为由数据驱动,访问外部数据。 通过这一点,我们已经编写了我们的第一个组件并将其设置为子/父关系。但是,我们还没有将任何数据绑定到我们的React组件。虽然在React中写一个网站是一个更愉快的体验(在我们看来),我们还没有利用React的力量来显示任何动态数据。 今天我们来改一下。 数据驱动回想一下,昨天我们构建了包含头和活动列表的时间轴组件的开始: 我们将演示分解成组件,最终用静态JSX模板构建了三个独立的组件。每当我们改变网站的数据时,不得不更新我们组件的模板是不方便的。 而是让我们给出要使用的组件数据进行显示。我们从 让我们告诉React,我们希望能够将标题设置为别的东西。 介绍属性React允许我们以与HTML相同的语法向组件发送数据,使用组件上的特性或 我们可以访问组件内的这些属性 回想一下,我们将 class Header extends React.Component { render() { return ( <div className="header"> <div className="menuIcon"> <div className="dashTop"></div> <div className="dashBottom"></div> <div className="circle"></div> </div> <span className="title"> {this.props.title} </span> <input type="text" className="searchInput" placeholder="Search ..." /> <div className="fa fa-search searchIcon"></div> </div> ) } } 当我们使用该 <Header /> 我们可以 <Header title="Timeline" /> 在我们的组件内部,我们可以 import React from 'react' class Header extends React.Component { render() { return ( <div className="header"> <div className="menuIcon"> <div className="dashTop"></div> <div className="dashBottom"></div> <div className="circle"></div> </div> <span className="title"> {this.props.title} </span> <input type="text" className="searchInput" placeholder="Search ..." /> <div className="fa fa-search searchIcon"></div> </div> ) } } export default Header 现在我们的 <Header title="Timeline" /> <Header title="Profile" /> <Header title="Settings" /> <Header title="Chat" /> 结果四个 很漂亮,是吗?现在我们可以复用 我们可以传递不仅仅是组件中的字符串。我们可以传递数字,字符串,各种对象,甚至功能!我们将进一步讨论如何定义这些不同的属性,以便稍后构建组件api。 我们来看 回想一下,昨天我们定义了我们的 class Content extends React.Component { render() { return ( <div className="content"> <div className="line"></div> {/* Timeline item */} <div className="item"> <div className="avatar"> <img src="http://p0.qhimg.com/t01e9226cd16ce24fb4.jpg" /> Doug </div> <span className="time"> An hour ago </span> <p>Ate lunch</p> <div className="commentCount"> 2 </div> </div> {/* ... */} </div> ) } } 和我们
假设我们有一个代表活动项目的JavaScript对象。我们将有一些字段,如字符串字段(文本)和日期对象。我们可能会有一些嵌套的对象 { 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!' } ] } 就像我们将一个字符串标题传递给 为了将动态变量的值传递给一个模板,我们必须使用模板语法在我们的模板中呈现。例如: import React from 'react' class Content extends React.Component { render() { const {activity} = this.props; // ES6 destructuring return ( <div className="content"> <div className="line"></div> {/* Timeline item */} <div className="item"> <div className="avatar"> <img alt={activity.text} 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> ) } } export default Content 我们在我们的类定义中使用了一点ES6,在第一行定义就是这个 // these lines do the same thing const activity = this.props.activity; const {activity} = this.props; 解构使我们能够以更短,更紧凑的方式节省打字和定义变量。 然后,我们可以通过传递一个对象作为支持而不是硬编码的字符串来_使用_这个新内容。例如: <Content activity={moment1} /> 太棒了,现在我们有一个由一个对象驱动的活动项。但是,您可能已经注意到,我们将不得不使用不同的注释实现这个多次。相反,我们可以将一组对象传递到组件中。 假设我们有一个包含多个活动项目的对象: const activities = [ { timestamp: new Date().getTime(),user: { id: 1,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',comments: [{ from: 'Nate',text: 'I am so jealous' }] },] 我们可以 <Content activities={activities} /> 但是,如果我们刷新视图什么都不会出现!我们需要先更新我们的 我们将我们的活动项目 JSX 移动 import React from 'react' class Content extends React.Component { render() { const {activities} = this.props; // ES6 destructuring return ( <div className="content"> <div className="line"></div> {/* Timeline item */} {activities.map((activity) => { return ( <div className="item"> <div className="avatar"> <img alt={activity.text} 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> ) } } export default Content 现在我们可以将任何数量的活动传递给我们的数组, 活动项这里写一个组件包含显示单个活动项然后再建立一个复杂的 让我们更新我们的 import React from 'react' import ActivityItem from './ActivityItem'; class Content extends React.Component { render() { const {activities} = this.props; // ES6 destructuring return ( <div className="content"> <div className="line"></div> {/* Timeline item */} {activities.map((activity) => ( <ActivityItem activity={activity} /> ))} </div> ) } } export default Content 这不仅仅是简单易懂,而且使得这两个组件的测试更容易。 使用我们新鲜的 import React from 'react' class ActivityItem extends React.Component { render() { const {activity} = this.props; // ES6 destructuring return ( <div className="item"> <div className="avatar"> <img alt={activity.text} 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> ) } } export default ActivityItem 本周,我们使用React (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |