微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当更改来自另一个组件时,如何让 useEffect 仅更新更改

如何解决当更改来自另一个组件时,如何让 useEffect 仅更新更改

我正在使用 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),[reservations]);

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

感谢您的帮助。

解决方法

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

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
      ),[])

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?