Учебники

ReactJS — Компоненты

В этой главе мы узнаем, как комбинировать компоненты, чтобы упростить обслуживание приложения. Такой подход позволяет обновлять и изменять ваши компоненты, не затрагивая остальную часть страницы.

Пример без сохранения состояния

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