我制作了一个多选项列表,并一直在努力提高它的重新渲染性能.下面的代码显示了我所做的(在我的实际项目中,列表要长得多).
<div id="app" />
const animals = ['Cat', 'Dog', 'Bird', 'Fish']
interface AnimalProps {
selected: boolean;
name: string;
onClick: (name: string) => void;
}
const Animal = ({selected, name, onClick}: AnimalProps) => (
<div onClick={onClick}>{`[${selected ? 'X' : ' '}]`} {name}</div>
)
const useFilter = (initialValue: string[]) => {
const [items, setItems] = React.useState<string[]>(initialValue)
const makeOnClick = (item: string) => () => {
const ix = items.indexOf(item)
const newItems = (ix > -1) ?
[...items.slice(0, ix), ...items.slice(ix + 1)]
:
[...items, item]
setItems(newItems)
}
const isSelected = (item: string) => items.indexOf(item) > -1
return { items, makeOnClick, isSelected };
}
const App = () => {
const {items, makeOnClick, isSelected} = useFilter([])
return (
<div>
<ul>
{animals.map(i => (
<Animal name={i} selected={isSelected(i)} onClick={makeOnClick(i)} key={i} />
))}
</ul>
<div>Selected: {items.join(', ')}</div>
</div>
)
}
ReactDOM.render(<App />, document.querySelector('#app'))
"react": "17.0.2",
"react-dom": "17.0.2",