Обложка канала

Заметки про React

Короткие и полезные заметки про React

Заметки про React

4 года назад
Открыть в
Как работает поверхностное сравнение в React Поверхностное сравнение используется в React в качестве механизма для определения необходимости обновления компонента, массива зависимостей хука, изменения пропсов мемоизированного компонента. Давайте рассмотрим функцию поверхностного сравнения и разберемся как она работает.
import is from './objectIs';
import hasOwnProperty from './hasOwnProperty';

function shallowEqual(objA: mixed, objB: mixed): boolean {
  /**
   * Проверка равенства примитивных значений.
   */
  if (is(objA, objB)) {
    return true;
  }

  /**
   * Проверка на то, что текущие аргументы являются объектами и не равны null.
   */
  if (
    typeof objA !== 'object' ||
    objA === null ||
    typeof objB !== 'object' ||
    objB === null
  ) {
    return false;
  }

  /**
   * На этом шаге мы уверены что работаем с объектами, получаем ключи объекта.
   */
  const keysA = Object.keys(objA);
  const keysB = Object.keys(objB);

  /**
   * Сравниваем количество ключей объектов.
   */
  if (keysA.length !== keysB.length) {
    return false;
  }

  /**
   * Сравнение значения объекта для каждого ключа объекта A с объектом B.
   * Проверяется наличие ключа объекта A в объекте B.
   */
  for (let i = 0; i < keysA.length; i++) {
    const currentKey = keysA[i];
    if (
      !hasOwnProperty.call(objB, currentKey) ||
      !is(objA[currentKey], objB[currentKey])
    ) {
      return false;
    }
  }

  return true;
}
Выводы: - Для сравнения объектов используется Object.is вместо строгого равенства. - В поверхностном сравнение пустой массив и пустой объект равны. - Объект с индексами в ключах и массив с такими же значениями одинаковы, т.е. { 0: 2, 1: 3 } равен [2, 3]. - Из-за использования Object.is вместо ===, +0 и -0 не равны, а Number.NaN и NaN равны. www.chakshunyu.com/blog/ho…in-react
How Does Shallow Comparison Work In React?

Shallow comparison is a concept all over React development and documentation. It plays a key role in React’s internals, but it’s not often explained. This article covers how it works by diving into the source code and finishes with some interesting takeaways.

Chakshunyu