В этом обзоре мы проведем сравнение реактивности данных в таких библиотеках: React.js и Vue.js. Акцент будет на Vue.js, так как использую его на постоянной основе. Данная статья хорошо подойдёт для новичков.

В библиотеках появился "новый способ" обновления данных, который ускоряет процесс разработки нашего веб-приложения. Давайте введем такое понятие, как Virtual DOM.

Что такое VDOM?

Виртуальный DOM (VDOM) — это концепция программирования, в которой идеальное или «виртуальное» представление пользовательского интерфейса хранится в памяти и синхронизируется с «настоящим» DOM при помощи библиотеки, такой как ReactDOM. Этот процесс называется согласованием.

Работа Virtual DOM
Работа Virtual DOM

Virtual DOM – это то как под капотом работает рендеринг. В сравнении с DOM, он обновляет только новые части нашего кода, не запускает рендер всей страницы заново. Рендеринг в библиотеках, которые мы рассматриваем, работает по-разному, то есть задача самой реактивности. Давайте посмотрим, как это работает в библиотеках.

Сравнение Vue.js и React: Реактивность и Явное Обновление

Реактивность в Vue.js

Vue.js предлагает скрытую реактивность, основанную на объектах данных. Реактивные объекты объявляются с использованием методов Vue, и когда их свойства изменяются, Vue автоматически обновляет соответствующие части интерфейса.

Явное Обновление в React

В отличие от Vue.js, в React все изменения данных и обновления компонентов должны быть выполнены явно программистом с использованием методов setState (в компонент-классах) или хуков useState (в компонент-функциях). React не предоставляет встроенной системы реактивности, поэтому разработчик сам должен контролировать изменения данных и обновления компонентов.
Например, в компонент-функции мы объявили переменную и будем ее изменять с помощью useStateи без него.

import { useState } from "react";

export default function EmailForm() {
  const [email, setEmail] = useState('');

  return (
      <>
          <form>
              <label htmlFor="email">Email</label>
              <input 
                  type="email" 
                  id="email" 
                  value={email} 
                  onChange={(e) => setEmail(e.target.value)} 
                  required 
              />

              <button type="submit">Отправить</button>
          </form>
      </>
  );
}

Пример с использованием useState, при изменении в поле ввода, данные в этом поле тоже будут изменяться, то есть происходит ре-рендеринг компонента.

export default function EmailForm() {
  let email = ""

  return (
      <>
          <form>
              <label htmlFor="email">Email</label>
              <input 
                  type="email" 
                  id="email" 
                  value={email} 
                  required 
              />

              <button type="submit">Отправить</button>
          </form>
      </>
  );
}

Данный пример использовать настоятельно не рекомендую! Переменная email изменяется, но ре-рендеринг не происходит, поэтому мы не видим изменения нашей переменной.

Заключение

Мы провели сравнение ре-рендеринга страниц при обновлении данных на библиотеках Vue.js и React.js. Ввели понятие VDOM, которое используется в наших библиотеках, поняли принцип работы, рассмотрели конкретный пример. Надеюсь, данный обзор улучшит понимание работы ре-рендеринга в библиотеках. Буду рад подискутировать. Спасибо за Ваш фидбек!

Комментарии (11)


  1. APXEOLOG
    23.03.2024 23:10
    +5

    Надеюсь, данная статья будет Вам полезна и расширит понятие о Virtual DOM.

    А где статья-то?


    1. glebanya12 Автор
      23.03.2024 23:10

      Спасибо за ответ! Неправильно сформулировал, это обзор. Публикацию я переделаю, про VDOM информации почти нет. Смысл заключался в том, чтобы сравнить, как работает ре-рендеринг в библиотеках.


  1. IT-VAVILON
    23.03.2024 23:10

    Добрый день!
    Статья больше похоже не на сравнение двух конкретный технологий, а на описание разницы между двухсторонним и односторонним связыванием, название статьи не вяжется с ее содержимым (информации о Virtual DOM почти нет), ваши исследования можно обернуть в статью с названием "Отличения двухстороннего и одностороннего связывания". И немного добавить информации про эти концепции))


    1. glebanya12 Автор
      23.03.2024 23:10

      Добрый день!
      Спасибо за Ваш ответ. Буду досконально готовить материал на публикацию.


  1. devunion
    23.03.2024 23:10
    +2

    Понимание работы VDOM может быть решающим фактором при выборе библиотеки для разработки.

    Вы серьёзно? Мне почему-то кажется, что этот фактор вообще никем на практике даже не рассматривается. Нужно пояснять почему?


    1. glebanya12 Автор
      23.03.2024 23:10

      Спасибо за Ваш комментарий! Про VDOM информации совсем мало в моем обзоре. Тут больше сравнения, как работает реактивность в библиотеках. Это не самый важный фактор. Выбор скорее строиться (судя по моему опыту) на простоте изучения и, конечно, на синтаксисе.


  1. evgensenin
    23.03.2024 23:10

    Спасибо за обманутые ожидания.

    Теперь понял за что заминусили «статью»


    1. glebanya12 Автор
      23.03.2024 23:10

      Заранее извиняюсь за Ваши ожидания, статью сейчас отредактировал, если есть вопросы, то пишите, рад буду ответить!


  1. Muhammadyusuf
    23.03.2024 23:10

    Лучше переименовать статью на Реактивность в Vue и React. Не то, что я ожидал.


    1. glebanya12 Автор
      23.03.2024 23:10

      Спасибо за ответ!


  1. Alexandroppolus
    23.03.2024 23:10

    Если хочется "реактивность как во Vue", просто возьмите mobx