0

有时,我们只需要使用共享状态的访问器/修改器(例如:)setBlockPickerMenu

const [blockPickerMenu, setBlockPickerMenu] = useRecoilState(blockPickerMenuState);
...
setBlockPickerMenu(null)

而且我们不需要值本身(例如:)blockPickerMenu

当我们执行上述操作时,React 内部会发生什么?blockPickerMenu即使我们不主动使用组件,组件是否也会订阅更改?它是否会在更改时执行不必要的重新渲染?有没有办法以某种方式优化事物?

上面的示例使用了 Recoil,但我认为它对于任何共享状态(Redux 等)都可以类似地工作

4

1 回答 1

2

useRecoilState useRecoilValue将隐式订阅组件到给定状态的调用。

function useRecoilState(recoilState) {
  // ...
  return [useRecoilValue(recoilState), useSetRecoilState(recoilState)];
}

所以是的,即使在只需要设置器时不使用状态,它也会订阅。

如果您只想订阅 setter,请调用useSetRecoilState(state).

我认为它对于任何共享状态(Redux 等)都可以类似地工作

你不能假设,每个库及其实现,例如在 Redux 中,你不能有这样的用例,因为 setter 和 state 是通过useDispatchand解耦的useSelector

于 2021-02-10T16:44:06.013 回答