Работает как положено. Функция сравнения на равенство запускается только для рендеров ПОСЛЕ первого рендеринга. Нет ничего, с чем "сравнивать" реквизиты на первом рендере, потому что именно тогда он запоминается. Таким образом, вы не видите лог "memo"
в консоли - он рендерится один раз, но компонент приложения не рендерится, поэтому функция сравнения не вызывается.
Попробуйте добавить простое обновление состояния в компонент приложения, чтобы вызвать повторную визуализацию. Вы увидите строки "memo"
в консоли, однако запомненные функции компонентов не будут работать, потому что они были успешно запомнены.
class App extends Component {
render() {
const { steps } = this.props;
return (
<div onClick={() => {
this.setState({ time: Date.now() })
}}>
{steps.steps.map((step, index) => (
<MemoItem key={index} step={step} />
))}
</div>
);
}
}
Изменить: Я укажу, что это почти наверняка бессмысленно для вас, чтобы сделать эту оптимизацию. React.memo
существует для очень ограниченных случаев, когда повторное рендеринг компонентов вызывает серьезные проблемы с производительностью. Возможно, вы делаете это как упражнение в изучении React, но в подавляющем большинстве случаев собственных внутренних оптимизаций React более чем достаточно. Преждевременная оптимизация - это плохо!