ReactJS - Компоненты
В этой главе мы узнаем, как комбинировать компоненты, чтобы упростить поддержку приложения. Такой подход позволяет обновлять и изменять ваши компоненты, не затрагивая остальную часть страницы.
Пример без гражданства
Наш первый компонент в следующем примере - App. Этот компонент является владельцемHeader и Content. Мы создаемHeader и Content отдельно и просто добавив его внутри JSX-дерева в наш Appсоставная часть. Только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 элементы, куда мы будем динамически вставлять TableRow для каждого объекта из data массив.
Видно, что мы используем синтаксис стрелки 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'));
Note - Обратите внимание, что мы используем key = {i} inside map()функция. Это поможет React обновлять только необходимые элементы вместо повторного рендеринга всего списка, когда что-то меняется. Это огромный прирост производительности для большего количества динамически создаваемых элементов.