【全栈React】第13天: 重复元素
今天,我们将通过如何显示多个组件来准备将外部数据引入我们的应用。 我们已经构建了一个没有任何外部数据的基本应用。在我们实现之前 (我们将在明天开始这个功能),让我们来看看过去两周中我们所掩盖的事情: 重复元素我们已经看到了这之前,我们已经遍历了一个对象列表,并在屏幕上呈现多个组件。在我们的应用中添加太多的复杂度来加载外部数据之前,今天我们将快速了解如何在应用中重复组件/元素。 由于 jsx 被浏览器视为纯 javascript 的,我们可以使用任何 传统 javascript 内的模板标签中的 jsx。我们已经看到了这一行动。作为一个快速演示: const App = (props) => { return ( <ul> {a.map(i => { return <li>{i}</li> })} </ul> ) } 注意模板标签 让我们来看看这是什么意思。让我们将上一个示例的 const a = [1,10,100,1000,10000]; 我们可以将 const App = (props) => { return ( <ul> {a.map(i => { return <li>{i}</li> })} </ul> ) }
让我们更新我们在第12天创建的应用与我们的 import React from 'react'; const a = [1,10000]; const App = (props) => { return ( <ul> {a.map(i => { return <li>{i}</li> })} </ul> ) } export default App 使用
但是,如果我们打开开发人员控制台,我们将看到打印出错误。此错误是由以下事实引起的: React不知道如何跟踪我们列表中的各个组件,因为它们只是看起来像一个 出于性能原因,React使用虚拟 DOM 尝试限制在重新视图时需要更新的 DOM 元素的数量。如果没有任何变化,React不会使浏览器更新任何东西以节省工作。 此功能非常适合于构建 web 应用,但有时我们必须通过为节点提供唯一标识符来帮助做出React。在映射列表和渲染组件是其中之一。 React要求我们通过使用特殊属性来识别惟一的组件,这是列表中每个元素的 让我们更新映射来设置key: const App = (props) => { return ( <ul> {a.map(i => { return <li key={i}>{i}</li> })} </ul> ) } 子组件我们在本周早些时候谈到了建立父子关系的事情,但是让我们更详细地介绍一下如何访问父组件中的子组件,以及如何呈现它们。 在第11天,我们构建了一个 const Formatter = (props) => { let children = props.format.split('').map((e,idx) => { if (e === 'h') { return <Hour key={idx} {...props} /> } else if (e === 'm') { return <Minute key={idx} {...props} /> } else if (e === 's') { return <Second key={idx} {...props} /> } else if (e === 'p') { return <Ampm key={idx} {...props} /> } else if (e === ' ') { return <span key={idx}> </span>; } else { return <Separator key={idx} {...props} /> } }); return <span>{children}</span>; } 我们可以用 const Formatter = ({format,state}) => { let children = format.split('').map(e => { if (e == 'h') { return <Hour /> } else if (e == 'm') { return <Minute /> } else if (e == 's') { return <Second /> } else if (e == 'p') { return <Ampm /> } else if (e == ' ') { return <span> </span>; } else { return <Separator /> } }); return (<span> {React.Children .map(children,c => React.cloneElement(c,state))} </span>) }
让我们使用 const App = (props) => { return ( <ul> {React.Children.map(a,i => <li>{i}</li>)} </ul> ) } 在浏览器中,一切仍然正常。
在 通过这一点,我们只处理了本地数据,而不是真正关注远程数据 (尽管我们在构建活动提要组件时 已经 简要地提到了它)。明天,我们将进入与服务器的互动,所以我们可以使用它在我们的React应用。 今天的工作很棒! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |