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 обновлять только необходимые элементы вместо повторного рендеринга всего списка, когда что-то меняется. Это огромный прирост производительности для большего количества динамически создаваемых элементов.