【发布时间】:2021-11-14 15:27:07
【问题描述】:
我当前使用 React 钩子的项目存在问题。
我要做的只是使用 (shift+click) 来选择我的任务。看起来像这样:
代码如下:
...
const [selectedTaskIds, setSelectedTaskIds] = useState<string[]>([])
const selectTask = useCallback(
(e: MouseEvent<HTMLDivElement>, taskId: string): void => {
e.stopPropagation()
const previousTaskId = selectedTaskIds[selectedTaskIds.length - 1]
if (previousTaskId && e.shiftKey) {
// handle shift+click
const previousIdx = tasks.findIndex((task) => task.id === previousTaskId)
const selectedIdx = tasks.findIndex((task) => task.id === taskId)
const rangeTasks =
previousIdx < selectedIdx
? tasks.slice(previousIdx, selectedIdx + 1)
: tasks.slice(selectedIdx, previousIdx + 1)
const rangeIds = rangeTasks.map((task) => task.id)
setSelectedTaskIds([...new Set([...selectedTaskIds, ...rangeIds])])
} else {
// if no key clicked, just select 1 task item
setSelectedTaskIds([taskId])
}
},
[selectedTaskIds, tasks] // <==== in here I notice that activeTaskIds is changed overtime that causes all of my <TaskItem> rerender
)
return (
{tasks.map((task) => (
<TaskItem
key={task.id}
taskId={task.id}
onClick={selectTask} // <=== selectTask will be different if user click on one of the task items
active={selectedTaskIds.includes(task.id)}
/>
))}
)
问题是,要知道当用户使用shift+click时我应该选择哪些任务,我需要知道当前选择的任务id,所以我需要将selectedTaskIds作为useCallback()deps传递。
这使得每当用户选择任务,甚至只是单击其中一个任务项来选择任务时,它都会重新呈现我的 all 我的<TaskItem>,因为selectTask()由于 useCallback 的 deps 发生了函数变化。
如何在不重新渲染我的所有 <TaskItem>s 的情况下解决这个问题?非常感谢!
【问题讨论】:
-
您是否尝试过不将任何
deps传递给useCallback(我的意思是空的[])?然后会发生什么? -
是的,我这样做了,它不会重新渲染所有子项,但是当我使用
shift+click选择多个任务项时,它无法按预期工作(仅选择了一项)
标签: reactjs optimization react-hooks react-typescript rerender