在本章中,我们将学习如何组合组件以使应用程序更易于维护。 这种方法允许更新和更改组件,而不会影响页面的其余部分。
下例中的第一个组件是App。 此组件是标题和内容的所有者。这里分别创建Header
和Content
,并将其添加到App组件的JSX树中。 只有App组件需要导出。
文件:App.jsx -
import React from 'react'; class App extends React.Component { render() { return ( <div> <Header/> <Content/> </div> ); } } class Header extends React.Component { render() { return ( <div> <h1>Header</h1> </div> ); } } class Content extends React.Component { render() { return ( <div> <h2>Content</h2> <p>The content text ~ </p> </div> ); } } export default App;
为了能够在页面上呈现,需要将它导入main.js
文件并调用reactDOM.render()
。 在设置环境的时候就已经这样做了。
文件:main.js -
import React from 'react'; import ReactDOM from 'react-dom'; import App from './App.jsx'; ReactDOM.render(<App />, document.getElementById('app'));
上面的代码将生成以下结果 -
在这个例子中,我们将设置所有者组件(App)的状态。 Header
组件就像上一个例子一样添加,但它不需要任何状态。这里创建table
和tbody
元素,而不是content
标签,在这里为数据数组中的每个对象动态插入TableRow
。
可以看出,我们使用的EcmaScript 2015
箭头语法(⇒)看起来比旧的JavaScript语法更清晰。 这将帮助我们用更少的代码来创建元素。 当需要创建一个包含很多项目的列表的时候,它是非常有用的。
文件:App.jsx -
import React from 'react'; class App extends React.Component { constructor() { super(); this.state = { data: [ { "id":1, "name":"Foo", "age":"20" }, { "id":2, "name":"Bar", "age":"30" }, { "id":3, "name":"Baz", "age":"40" } ] } } render() { return ( <div> <Header/> <table> <tbody> {this.state.data.map((person, i) => <TableRow key = {i} data = {person} />)} </tbody> </table> </div> ); } } class Header extends React.Component { render() { return ( <div> <h1>Header</h1> </div> ); } } class TableRow extends React.Component { render() { return ( <tr> <td>{this.props.data.id}</td> <td>{this.props.data.name}</td> <td>{this.props.data.age}</td> </tr> ); } } export default App;
注意 - 注意我们在map()
函数中使用key = {i}
。 这将有助于React更新只有必要的元素,而不是在发生更改时重新呈现整个列表。 对于大量动态创建的元素来说,这是一个巨大的性能提升。得到以下结果 -