В этой главе мы узнаем, как комбинировать компоненты, чтобы упростить обслуживание приложения. Такой подход позволяет обновлять и изменять ваши компоненты, не затрагивая остальную часть страницы.
Пример без сохранения состояния
Наш первый компонент в следующем примере это приложение . Этот компонент является владельцем заголовка и содержимого . Мы создаем заголовок и контент отдельно и просто добавляем их в дерево JSX в нашем компоненте приложения . Только компонент приложения должен быть экспортирован.
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 и вызвать responseDOM.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 , в которые мы будем динамически вставлять 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;
main.js
import React from 'react'; import ReactDOM from 'react-dom'; import App from './App.jsx'; ReactDOM.render(<App/>, document.getElementById('app'));
Примечание. Обратите внимание, что мы используем key = {i} внутри функции map () . Это поможет React обновить только необходимые элементы вместо повторного рендеринга всего списка, когда что-то изменится. Это огромный прирост производительности для большего количества динамически создаваемых элементов.