我有一个反应组件,它在 useState 中存储一组水果。我有一个过滤水果的记忆函数(visibleFruits)。我将 visibleFruits 映射到 dom。
问题是,当我检查一个水果时,所有可见的水果都会重新渲染。
我期望只有选定的一个重新渲染,因为它是唯一一个正在改变的。
有没有办法让我使用这种模式,但防止所有人在检查时重新渲染?
在现实生活中,visibleFruits useMemo 中有一个复杂的功能。所以我不能简单地在地图之前附加过滤器。
编辑,这里是更新的编辑:
const Example = () => {
const [fruits, setFruits] = React.useState([
{ id: 1, name: 'apple', visible: true, selected: false },
{ id: 2, name: 'banana', visible: false, selected: false },
{ id: 3, name: 'orange', visible: true, selected: false }
])
const visibleFruits = React.useMemo(() => {
return fruits.filter((f) => f.visible)
}, [fruits])
const handleCheck = (bool, id) => {
setFruits((prev) => {
return prev.map((f) => {
if (f.id === id) {
f.selected = bool
}
return f
})
})
}
return (
<div>
{visibleFruits.map((fruit) => {
return <FruitOption fruit={fruit} handleCheck={handleCheck} />
})}
</div>
)
}
const FruitOption = ({ fruit, handleCheck }) => {
console.log('** THIS RENDERS TWICE EVERY TIME USER SELECTS A FRUIT **')
return (
<div key={fruit.id}>
<input
checked={fruit.selected}
onChange={(e) => handleCheck(e.target.checked, fruit.id)}
type='checkbox'
/>
<label>{fruit.name}</label>
</div>
)
}
export default Example