【发布时间】:2022-01-05 19:07:27
【问题描述】:
我有一个包含数千个字符串的数组并被传递给一个组件:
主要组件:
const array = ['name1', 'name2', 'name3'];
const [names, setNames] = useState(array);
const onClick = (index) => {
setNames(names.map((name, i) => {
if (i === index) {
return 'name changed';
}
};
};
return (
<ul>
{array.map((name, index) => (
<li key={index}>
<ShowName name={name} key={index} onClick={() => onClick(index)} />
</li>
)}
</ul>
);
ShowName 组件:
let a = 0;
export default function ShowName({ name, onClick }) {
a += 1;
console.log(a);
return (
<button type="button" onClick={onClick}>{name}</button>
);
}
还有一个随机更改名称的按钮。但是每当按下按钮时,所有ShowName 组件都会重新渲染。我一直在尝试使用 useCallback 和 useMemo,但是组件仍在重新渲染 x 次(x 是数组的长度)。
const ShowNameHoc = ({ name }) => {
return <ShowName name={name} />
};
return (
<div>
{array.map((name, index) => <ShowNameHoc name={name} key={index} />)}
</div>
);
如果我只想重新渲染带有更改的组件,该怎么办?
【问题讨论】:
-
您使用数组映射来渲染每个项目,为什么您认为它不会渲染每个项目?
-
@andymccullough 你有什么建议可以让我更有效地做到这一点吗?
-
您是如何得出每个组件都重新渲染的结论的?
-
我添加了一个计数器,每次单击按钮时,计数都会增加数组长度的确切数量。
标签: javascript reactjs render usecallback react-usememo