A-Level. React. State & Lifecycle & Events.

React Logo State and Lifecycle

Теми

  1. Внутрішній стан компонента
  2. Методи життєвого циклу
  3. Події

Virtual DOM

Віртуальний DOM (VDOM) — це концепція програмування, у якій "віртуальне" представлення користувацького інтерфейсу зберігається в пам'яті та синхронізується з «реальним» DOM за допомогою бібліотеки, такої як ReactDOM. Цей процес називається узгодженням (reconciliation).

Virtual DOM

Коли ми змінюємо якийсь компонент і він має перерендеритися, спочатку зміни вносяться у VDOM, після чого відбувається порівняння (узгодження / reconciliation) з реальним DOM, і перерендерюється лише частина яка змінилася.

Props

Props

Пропси можна лише ЧИТАТИ !!!

            function Input(props) {
              props.value = 'baz' // НЕ МОЖНО
              return <input value={props.value} />
            }
        

State (стан)

Конструктор — єдине місце, де можна безпосередньо змінювати state.
this.state = { count: 0 };

В інших місцях необхідно використовувати this.setState().
this.setState({ count: state.count + 1 })

setState асинхронний

setState(updater, [callback]) додає в чергу зміни у стані компонента. Тобто думайте про setState() як про запит на зміни, а не як про команду для негайного оновлення компонента.

            this.setState((state, props) => {
              return {counter: state.counter + props.step};
            });
        

setState асинхронний

Часткове злиття стану

Оновлюються лише передані властивості. Тобто в цьому прикладі зміниться лише значення productId

                class Cart extends Component {
                  state = {
                    value: 'defaultValue',
                    productId: null,
                  };
                  ...
                  onAddToCart = (productId) => {
                    this.setState({ productId });
                  }
                }
            

Lifecycle

Монтування
  1. constructor()
  2. static getDerivedStateFromProps()
  3. render()
  4. componentDidMount()
Відєʼднання
  1. componentWillUnmount()
Оновлення
  1. static getDerivedStateFromProps()
  2. shouldComponentUpdate()
  3. render()
  4. getSnapshotBeforeUpdate()
  5. componentDidUpdate()

Constructor

constructor() - ініціалізація компонента. Викликається до того, як компонент буде примонтований.

Конструктори в React зазвичай використовують для двох цілей:

Render

Під час виклику він перевіряє this.props і this.state та повертає один із наступних варіантів:

componentDidMount

Викликається одразу після монтування (тобто коли компонент вставляється в DOM).

Це місце для:

componentWillUnmount

Викликається безпосередньо перед відєʼднанням і видаленням компонента.

У цьому методі виконується необхідне очищення: скасування таймерів, мережевих запитів і підписок, створених у componentDidMount().

componentDidUpdate

Викликається одразу після оновлення. Не викликається під час першого рендеру.

Метод дозволяє працювати з DOM під час оновлення компонента. Також він підходить для виконання мережевих запитів, які виконуються на основі результату порівняння поточних пропсів із попередніми. Якщо пропси не змінилися, новий запит може бути не потрібен.

getDerivedStateFromProps

Цей метод потрібен для рідкісних випадків, коли state залежить від змін в props

shouldComponentUpdate

            shouldComponentUpdate(nextProps, nextState) {
              return nextProps.id !== this.props.id
            }
        

getSnapshotBeforeUpdate

Викликається безпосередньо перед етапом "фіксації" (наприклад, перед додаванням у DOM).

Він дозволяє вашому компоненту отримувати певну інформацію з DOM (наприклад, положення прокрутки) перед її можливими змінами. Будь-яке значення, повернуте цим методом життєвого циклу, буде передане як параметр у componentDidUpdate().

Events

Назви події в React пишуться у стилі camelCase замість нижнього регістра.

В JSX ви передаєте функцію як обробник події замість рядка.

Приклад, в HTML
<button onclick="activateLasers()">Кнопка в html</button>
Приклад, в React
<button onClick={activateLasers}>Кнопка в react</button>
Відміна події
                function handleSubmit(e) {
                  e.preventDefault();
                  console.log('Відправлена форма.');
                }
            
Передача аргументів у обробники подій
                <button onClick={(e) => this.deleteRow(id, e)}>Видалити рядок</button>
                <button onClick={this.deleteRow.bind(this, id)}>Видалити рядок</button>
            

SyntheticEvent

SyntheticEvent - це кросбраузерна обгортка над нативним екземпляром події. Ця обгортка допомагає подіям працювати однаково в усіх браузерах (тобто мати однакові властивості у всіх браузерах).

Якщо все ж потрібно отримати нативну браузерну подію, зверніться до атрибута nativeEvent.
                handleClick = (e) => {
                  console.log(e.nativeEvent)
                }
            

Фаза вспливання/перехоплення

Обробники викликаються на фазі спливання (bubbling). А щоб оголосити подію на фазі перехоплення (capture), просто додайте Capture до назви події; наприклад, замість onClick використовуйте onClickCapture, щоб обробити подію на фазі перехоплення.

            <button onClickCapture={this.handleClick}>Кнопка</button>
        

Переваги

Task 1.

Створити counter, який буде додавати/віднімати коли клікаємо на відповідні кнопки
task counter

Task 2.

Зробити форму авторизації:

Task 3: ToDo List

task todo

Links