2022-03-01 10:55:16
在React中,若要确保useEffect(..., [props.scrollToIdx])每次都执行,需根据实际需求选择以下两种方案之一:
方案一:使用空依赖数组(强制每次执行)若需无条件在组件每次渲染后执行副作用(无论props.scrollToIdx是否变化),可将依赖数组设为空:
useEffect(() => { // 滚动逻辑 if (props.scrollToIdx) { // ... }}, []); // 空数组表示无依赖若需响应式更新但依赖项未变化,可通过以下方式强制触发:
使用key属性强制重新挂载:为组件添加一个唯一key,当key变化时组件会重新挂载,从而触发useEffect:
<SubContainer key={`${props.scrollToIdx}-${Date.now()}`} {...props} />缺点:会完全销毁并重建组件,可能丢失内部状态。
结合useReducer或useState生成额外依赖:通过内部状态标记变化,间接触发useEffect:
const [forceUpdate, dispatchForceUpdate] = useReducer(x => x + 1, 0);useEffect(() => { // 滚动逻辑 if (props.scrollToIdx) { // ... }}, [props.scrollToIdx, forceUpdate]); // 添加forceUpdate作为依赖// 父组件中通过dispatchForceUpdate触发更新若副作用为DOM操作(如滚动),可通过ref和useImperativeHandle实现直接调用,绕过响应式更新:
根据具体场景选择最优方案,优先通过依赖项精确控制useEffect执行,避免不必要的渲染或计算开销。