Я нахожусь в процессе рефакторинга некоторых наших компонентов, поэтому я пытаюсь включить мемоизацию, поскольку некоторые компоненты могут повторно визуализировать с теми же значениями (например, URL-адреса изображений с горячими ссылками, если они не то же самое).
У меня простой компонент:
const CardHeader = props => {
// img is a stringand showAvatar is a boolean but it's always true
const { ..., showAvatar, img } = props;
return (
<CardHeader>
<ListItem>
// AvatarImage shouldn't re-render if img is the same as previous
{showAvatar && <AvatarImage img={img} />
</ListItem>
</CardHeader>
);
}
А потом AvatarImage :
const AvatarImage = React.memo(props => {
console.log("why is this still re-rendering when the img value hasn't changed?");
const { img } = props;
return (
<ListItemAvatar>
{img ?
<Avatar src={img} />
:
<Avatar>
Some initials
</Avatar>
}
</ListItemAvatar>
);
});
Я тоже пробовал пройти во втором аргументе мемо:
(prevProps, nextProps) => {
return true; // Don't re-render!
}
Но console.log все равно отображается каждый раз. Я явно что-то здесь упускаю или не совсем понимаю, как это работает. Этот компонент находится на несколько уровней ниже, но он проходит в img, если он доступен каждый раз, поэтому я ожидаю, что он будет знать, что если img был передан в предыдущем рендере, и это то же самое, что он знает, чтобы не перерисовывать его снова а почему то есть?
Всем спасибо. Это очень ценно.