【问题标题】:How to get useEffect to only update on changes when the change is from another component当更改来自另一个组件时,如何让 useEffect 仅更新更改
【发布时间】:2021-07-20 09:33:44
【问题描述】:

我正在使用 zustand 进行状态管理,并且在检索一次数据后,当组件状态发生变化时,我试图只实时更新组件而不刷新页面。

这是我的商店

export const useStore = create((set) => ({
  reservations: [],
  getReservations: async () => {
    const response = await axios.get(baseUrl);
    set({ reservations: response.data });
  },
  setRev: (reservations) => {
    set((state) => ({
      ...state,
      reservations,
    }));
  },
  addReservation: (reservation) => {
    set((state) => ({ reservations: [...state.reservations, reservation] }));
  },
  removeReservation: (id) => {
    set((state) => ({
      reservations: state.reservations.filter(
        (reservation) => id !== reservation._id
      ),
    }));
  },
}));

我已经尝试使用 useEffect 挂钩来检索数据,如下面的代码所示,我有另一个组件调用 addReservation 函数。下面的代码会导致无限调用useEffect,而不是仅在const reservations发生更改时才更新,当另一个组件调用addReservation函数时。

const getAllReservation = useStore((state) => state.getReservations);
  const reservations = useStore((state) => state.reservations);
  const reservationsRef = useRef(useStore.getState().reservations);

  useEffect(() => {
    getAllReservation()
    useStore.subscribe(
      (reservations) => (reservationsRef.current = reservations),
      (state) => state.reservations
    );
  }, [reservations]);

我曾尝试拆分 useEffects,但需要再次刷新页面以显示更新的数据。 (想要的结果是没有刷新)

  useEffect(() => {
    getAllReservation()
  }, [])
  useEffect(() => {
    useStore.subscribe(
      (reservations) => (reservationsRef.current = reservations),
      (state) => state.reservations
    );
  }, [reservations]);

我尝试将 [] 作为依赖数组作为 useEffect 挂钩中的第二个参数,但效果不佳。

感谢您的帮助。

【问题讨论】:

  • 尝试为 getAllReservation() 函数创建另一个 useEffect(这样你就有 2 个)。
  • 我试过了,还是不行,谢谢

标签: reactjs react-hooks zustand


【解决方案1】:

React 无法检测到 Ref 内部的变化。所以需要将更新的预订作为道具传递或保存在本地状态。

Zustand docs

订阅功能允许组件绑定到状态部分 不强制重新渲染更改。最好将它与 useEffect 结合使用 卸载时自动取消订阅。这可以使一个激烈的 当您被允许直接改变视图时的性能影响。

  const useStore = create(set => ({ scratches: 0, ... }))
    function Component() {
      // Fetch initial state
      const scratchRef = useRef(useStore.getState().scratches)
      // Connect to the store on mount, disconnect on unmount, catch state-changes in a reference
      useEffect(() => useStore.subscribe(
        scratches => (scratchRef.current = scratches),
        state => state.scratches
      ), [])

【讨论】:

  • 我试过了,还是不行,我必须刷新页面才能显示更新的变化。
  • React 可能无法检测到 Ref 内部的变化,因此保留应该作为 props 传递或保存在本地状态中。
  • 嗨,使用 refs 是我在阅读临时更新部分下 github.com/pmndrs/zustand 的用户指南时发现的建议
  • """订阅功能允许组件绑定到状态部分而不强制重新渲染更改。""" 所以它不会用 ref 更新。
猜你喜欢
  • 2020-10-18
  • 2020-07-30
  • 1970-01-01
  • 2020-02-21
  • 1970-01-01
  • 1970-01-01
  • 2019-07-08
  • 2010-10-17
  • 2017-04-24
相关资源
最近更新 更多