You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在多页面展示React Redux获取的接口响应数据?

使用React Redux跨组件展示API数据步骤

注意:你当前的showUserApi里有个小问题——jsonplaceholder的/users接口直接返回用户数组,不是包含users属性的对象,所以return json.users会得到undefined,先改成return json。

1. 安装必要依赖

确保项目中安装Redux相关核心包:

npm install @reduxjs/toolkit react-redux

(Redux Toolkit是官方推荐的简化方案,比传统Redux写法更简洁高效)

2. 创建Redux状态管理模块

2.1 编写用户数据Slice

创建features/users/userSlice.js,统一管理用户数据的异步请求和状态:

import { createSlice, createAsyncThunk } from '@reduxjs/toolkit';

// 封装异步请求逻辑
export const fetchUsers = createAsyncThunk(
  'users/fetchUsers',
  async () => {
    try {
      const response = await fetch('https://jsonplaceholder.typicode.com/users');
      return await response.json();
    } catch (error) {
      throw error;
    }
  }
);

const userSlice = createSlice({
  name: 'users',
  initialState: {
    list: [],
    status: 'idle', // 状态标识:idle/loading/succeeded/failed
    error: null
  },
  reducers: {},
  // 处理异步action的状态变化
  extraReducers: (builder) => {
    builder
      .addCase(fetchUsers.pending, (state) => {
        state.status = 'loading';
      })
      .addCase(fetchUsers.fulfilled, (state, action) => {
        state.status = 'succeeded';
        state.list = action.payload;
      })
      .addCase(fetchUsers.rejected, (state, action) => {
        state.status = 'failed';
        state.error = action.error.message;
      });
  }
});

export default userSlice.reducer;

2.2 配置全局Store

创建app/store.js,整合所有reducer:

import { configureStore } from '@reduxjs/toolkit';
import userReducer from '../features/users/userSlice';

export const store = configureStore({
  reducer: {
    users: userReducer
  }
});

3. 在根组件注入Store

修改项目入口文件index.js,让整个应用能访问Redux状态:

import React from 'react';
import ReactDOM from 'react-dom/client';
import { Provider } from 'react-redux';
import { store } from './app/store';
import App from './App';

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <Provider store={store}>
    <App />
  </Provider>
);

4. 跨组件使用共享数据

user.js(展示name字段)

import React, { useEffect } from 'react';
import { useSelector, useDispatch } from 'react-redux';
import { fetchUsers } from '../features/users/userSlice';

const User = () => {
  const dispatch = useDispatch();
  const { list: users, status, error } = useSelector(state => state.users);

  // 组件挂载时触发数据请求
  useEffect(() => {
    if (status === 'idle') {
      dispatch(fetchUsers());
    }
  }, [dispatch, status]);

  // 处理加载/错误状态
  if (status === 'loading') return <div>加载中...</div>;
  if (status === 'failed') return <div>出错了:{error}</div>;

  return (
    <div>
      <h2>用户名称列表</h2>
      <ul>
        {users.map(user => (
          <li key={user.id}>{user.name}</li>
        ))}
      </ul>
    </div>
  );
};

export default User;

details.js(展示email字段)

import React, { useEffect } from 'react';
import { useSelector, useDispatch } from 'react-redux';
import { fetchUsers } from '../features/users/userSlice';

const Details = () => {
  const dispatch = useDispatch();
  const { list: users, status, error } = useSelector(state => state.users);

  useEffect(() => {
    if (status === 'idle') {
      dispatch(fetchUsers());
    }
  }, [dispatch, status]);

  if (status === 'loading') return <div>加载中...</div>;
  if (status === 'failed') return <div>出错了:{error}</div>;

  return (
    <div>
      <h2>用户邮箱列表</h2>
      <ul>
        {users.map(user => (
          <li key={user.id}>{user.email}</li>
        ))}
      </ul>
    </div>
  );
};

export default Details;

核心逻辑说明

  • 用createAsyncThunk封装异步请求,自动生成pending/fulfilled/rejected三种状态的action,无需手动编写复杂的action类型。
  • Provider组件将Redux Store注入应用全局,所有子组件都能通过useSelector获取共享状态,useDispatch触发action。
  • 两个组件会自动复用已加载的状态,不会重复发起请求,实现了跨页面/组件的数据共享。

内容的提问来源于stack exchange,提问作者mark Tumuli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 19:32:20