关于我 壹文 项目 三五好友
使用 FlushSync 解决 Axios 请求后,状态异步更新问题 2024-05-30

你是否遇到过在React 中使用 Axios 请求数据时,因为状态是异步更新的,导致的请求数据为空。

现在你可以使用 React 18 引入的flushSync来解决这个问题

flushSync 是一个用于同步更新状态的方法。它可以强制 React 在调用它时立即刷新渲染

来看看示例吧!

// 导入 flushSync 和 axios
import React, { useState } from "react";
import { flushSync } from "react-dom";
import axios from "axios";

// 初始化状态
function DataFetchingComponent() {
  const [data, setData] = useState(null);
  const [loading, setLoading] = useState(false);
  const [error, setError] = useState(null);

  // 创建一个异步函数 fetchData 来进行数据请求
  const fetchData = async () => {
    setLoading(true);
    setError(null);

    try {
      const response = await axios.get("https://api.example.com/data");

      // 在数据请求成功后,使用 flushSync 包装 setData 调用,状态将立即更新,并触发组件重新渲染
      flushSync(() => {
        setData(response.data);
      });
    } catch (err) {
      setError(err.message);
    } finally {
      setLoading(false);
    }
  };

  return (
    <div>
      <button onClick={fetchData}>Fetch Data</button>
      {loading && <p>Loading...</p>}
      {error && <p>Error: {error}</p>}
      {data && <div>{JSON.stringify(data)}</div>}
    </div>
  );
}

export default DataFetchingComponent;

注意:频繁使用 flushSync 可能会影响性能,因为它会强制 React 同步更新,跳过批处理优化。仅在确实需要立即更新状态时使用。

Not-By-AI