插件窝 干货文章 Zustand中异步操作后数据未更新:如何确保useStore()获取到的数据是最新的?

Zustand中异步操作后数据未更新:如何确保useStore()获取到的数据是最新的?

状态 useStore fetchData Zustand 489    来源:    2025-03-20

在Zustand中,异步操作后数据未更新的问题通常是由于状态更新没有正确触发组件重新渲染。为了确保 useStore() 获取到的数据是最新的,你可以采取以下几种方法:

1. 使用 set 函数更新状态

在Zustand中,set 函数用于更新状态。确保在异步操作完成后,使用 set 函数来更新状态。例如:

import create from 'zustand';

const useStore = create((set) => ({
  data: null,
  fetchData: async () => {
    const response = await fetch('/api/data');
    const result = await response.json();
    set({ data: result }); // 使用 set 函数更新状态
  },
}));

export default useStore;

2. 使用 useEffect 监听状态变化

在组件中,使用 useEffect 来监听状态的变化,并在状态更新时执行相应的操作。例如:

import React, { useEffect } from 'react';
import useStore from './useStore';

const MyComponent = () => {
  const data = useStore((state) => state.data);
  const fetchData = useStore((state) => state.fetchData);

  useEffect(() => {
    fetchData();
  }, [fetchData]);

  return (
    <div>
      {data ? <div>{JSON.stringify(data)}</div> : <div>Loading...</div>}
    </div>
  );
};

export default MyComponent;

3. 使用 zustand/middleware 中的 persist 中间件

如果你需要在异步操作后持久化状态,可以使用 zustand/middleware 中的 persist 中间件。这可以确保状态在页面刷新后仍然保持最新。

import create from 'zustand';
import { persist } from 'zustand/middleware';

const useStore = create(
  persist(
    (set) => ({
      data: null,
      fetchData: async () => {
        const response = await fetch('/api/data');
        const result = await response.json();
        set({ data: result });
      },
    }),
    {
      name: 'data-storage', // 持久化存储的名称
    }
  )
);

export default useStore;

4. 使用 zustand/shallow 进行浅比较

如果你在组件中使用了多个状态,可以使用 zustand/shallow 进行浅比较,以避免不必要的重新渲染。

import React from 'react';
import useStore from './useStore';
import shallow from 'zustand/shallow';

const MyComponent = () => {
  const { data, fetchData } = useStore(
    (state) => ({
      data: state.data,
      fetchData: state.fetchData,
    }),
    shallow
  );

  React.useEffect(() => {
    fetchData();
  }, [fetchData]);

  return (
    <div>
      {data ? <div>{JSON.stringify(data)}</div> : <div>Loading...</div>}
    </div>
  );
};

export default MyComponent;

5. 使用 zustand/middleware 中的 devtools 中间件

如果你在开发过程中遇到状态更新问题,可以使用 zustand/middleware 中的 devtools 中间件来调试状态更新。

import create from 'zustand';
import { devtools } from 'zustand/middleware';

const useStore = create(
  devtools((set) => ({
    data: null,
    fetchData: async () => {
      const response = await fetch('/api/data');
      const result = await response.json();
      set({ data: result }, false, 'fetchData/setData');
    },
  }))
);

export default useStore;

总结

通过以上方法,你可以确保在异步操作后,useStore() 获取到的数据是最新的。关键在于正确使用 set 函数更新状态,并在组件中监听状态变化。如果需要持久化状态或调试状态更新,可以使用相应的中间件来辅助开发。