@MishaXXL

Почему не происходит ререндер мемоизированного компонента при наличии в нем переменной с данными без useMemo?

В компоненте есть мемоизированный компонент
Почему, когда у нас data без useMemo, то компонент MemoCountBtn не перерисовывается при ререндере родителя?
Но при этом, если функцию foo написать без callBack, то MemoCountBtn рередерится
Хотя и foo и data пересоздаются при ререндере родителя

export function Root() {
const [num, setNum] = useState(1)

const foo = useCallback(() => {
    setNum(5)
  }, [])

  // function foo() {
  //   setNum(5)
  // }  

function counting(x) {
    return x * x * x
  }

  const data = counting(num)

<MemoCountBtn func={foo} data={data} />
}


Есть компонент
const CountBtn = ({ func, data}) => {
    return(
      <div>
        <p>{data}</p>
        <button onClick={() => func()}>
          Click CountBtn
        </button>
      </div>
    )
}

const MemoCountBtn = memo(CountBtn)
  • Вопрос задан
  • 86 просмотров
Решения вопроса 1
Seasle
@Seasle Куратор тега React
Потому что memo использует поверхностное сравнение, а у вас на входе примитив (просто число). А если функцию написать без useCallback она действительно создаётся новая, а в текущем useCallback пустой список зависимостей - значит и функция не будет пересоздаваться (это и не нужно).
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы