Убедитесь, что вложенные поля, в которых путь определяется переменным триггером React.useMemo, обновляются при добавлении в массив зависимостей

Я использую TypeScript 4 и React 17

У меня был этот код в кастомном хуке:

  const myValue = useMemo((): string[] => {
    if (someCondition) {
      return (myMap?.field && myMap.field.[subfieldId]) || null
    } else {
      ...
    }
  }, [myMap.field.[subfieldId]])

ESlint жаловался, что myMap.field. [SubfieldId] нужно было переместить в переменную для программной проверки.

Итак, я изменил на это:

  const currentData: string[] | null = (myMap?.field && myMap.field.[subfieldId]) || null

  const myValue = useMemo((): string[] => {
    if (someCondition) {
      return currentData
    } else {
      ...
    }
  }, [currentData])

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

ESLInt предлагает мне вместо этого сделать это, это намного проще:

  const myValue = useMemo((): string[] => {
    if (someCondition) {
      return (myMap?.field && myMap.field.[subfieldId]) || null
    } else {
      ...
    }
  }, [myMap.field])

Будет ли myMap.field достаточно, чтобы React узнал об изменении myMap.field[subfieldId]? Думаю, так и будет. Действительно, React не узнает, что изменилось, если я помещу только myMap, потому что сама ссылка на объект не изменится, но при сравнении предыдущего и нового myMap.field React проверит все подполя. Имеет ли это?

1 ответ

Согласно реагирующему линтеру крюка:

React Hook React.useMemo имеет ненужную зависимость: myMap. Либо исключите его, либо удалите массив зависимостей. Значения внешней области, такие как myMap, не являются допустимыми зависимостями, потому что их изменение не приводит к повторной визуализации компонента. (реагировать-крючки / исчерпывающие-глубины)

Так что вам должно быть хорошо с этим:

const myValue = useMemo((): string[] => {
  if (someCondition) {
    return myMap?.field[subfieldId] || null
  } else {
    // ...
  }
}, [subfieldId]);
Другие вопросы по тегам