React JS 组件在传递 props 时重新渲染,尽管有回调

React JS components rerendering despite callbacks when props are passed

在我的react项目中,我设置了回调来阻止过多的重新渲染,因为那里显示的数据相当大,并且有很多不同的按钮可供用户点击,所有这些都会导致重新渲染。

useCallback 挂钩起作用,并且不会调用重新呈现,除非我也将道具与 useCallback 函数一起传递,在这种情况下,每次用户与应用程序交互时都会重新呈现子组件。

例如,如果我像这样创建一个子组件:

<Dropdown
//props={{ cat, var }}
getLi={getLi}
getType={getType}
increment={increment}
/>

在下拉子项中,我将 cat 和 var 定义为 const cat = ""const var = "10"

当我单击子组件内的下拉菜单按钮时,组件不会重新呈现。

但是,如果我这样创建子组件 -

<Dropdown
props={{ cat, var }}
getLi={getLi}
getType={getType}
increment={increment}
/>

然后定义cat和var为const {cat, var} = props

回调函数不起作用,子组件不断重新渲染。

我尝试将 props 中的两个变量都添加到回调函数中的依赖项列表中,这也没有任何作用。

props={{ cat, var }}

每次运行时,它都会创建一个新对象。该对象可能具有相同的键和值,但它是一个新对象。如果你在 Dropdown 上使用 React.memo,那么它将在旧对象和新对象之间做一个 ===,看到它们不同,然后重新渲染。

如果你想跳过渲染,你需要确保你所有的道具都通过了 === 检查。所以你可以记住这个对象:

const example = useMemo(() => {
  return { cat, var }
}, [cat, var])

// ...
<Dropdown
  props={example}

或者把它拆分成单独的道具,这样每个道具都有自己的===检查。

<Dropdown
  cat={cat}
  var={var}
  getLi={getLi}
  // ...