【发布时间】:2019-11-08 22:37:18
【问题描述】:
我正在尝试呈现一个项目列表,每个项目都有一个按钮,按下该按钮会切换下拉菜单。
我的代码如下所示:
function ItemList({items}) {
const [isDropdownExpanded, setIsDropdownExpanded] = useState(null);
const itemClickHandlers = useMemo(() => {
const handlers = {}
items.forEach(item => {
handlers[item.id] = value => setIsDropdownExpanded(value ? item.id : null);
});
return handlers;
}, [items.map(item => item.id).join(',')]);
}
return (
<ul>
{items.map(item =>
<li onClick={itemClickHandlers[item.id]}>
<Item name={item.name} isDropdownExpanded={isDropdownExpanded === item.id}/>
</li>
)}
</ul>
);
上面的代码可以工作,但是当用户从列表中添加或删除一个项目时会浪费渲染。 (itemClickHandlers 生成一个包含所有新处理程序的新对象,即使只应创建或删除一个处理程序,所以列表中的每个项目都会重新呈现,因为 isDropdownExpanded 不会通过引用相等来相等。)
最好只使用功能性 React 组件,如何在项目列表更改时以最少的重新渲染来渲染这样的项目列表?
【问题讨论】:
标签: reactjs react-hooks