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

React中如何分离数据获取逻辑与UI组件(结合Context)

React 分离数据请求逻辑到 service.js 并结合 Context 更新状态的解决方案

要把数据获取逻辑分离到service.js,同时结合Context更新全局状态,你需要调整以下几个地方:

1. 改造 service.js 的请求函数

让getUser返回请求的Promise,这样组件能拿到接口返回的数据,而不是仅在service内部打印:

// services.js
import axios from 'axios';

export async function getUser() {
  const res = await axios.get("https://api/user/1/");
  return res.data;
}

2. 修正 NextButton 组件逻辑

通过useContext拿到Context里的setUserInfo,调用getUser获取数据后更新全局状态:

// NextButton.js
import { useContext } from 'react';
import { AppContext } from './App';
import { getUser } from './services';

const NextButton = () => {
  const { setUserInfo } = useContext(AppContext);

  const handleUser = async () => {
    try {
      const userData = await getUser();
      setUserInfo(userData);
    } catch (err) {
      console.error('获取用户数据失败:', err);
    }
  };

  // 修正之前绑定错误的函数名
  return <button onClick={handleUser}>NEXT</button>;
};

3. 修正 User 组件的变量错误

你之前在User组件里写的characterInfo是笔误,应该取userInfo.name,同时要处理初始状态为undefined的情况:

// User.js
import { useContext } from 'react';
import { AppContext } from './App';
import NextButton from './NextButton';

const User = () => {
  const { userInfo } = useContext(AppContext);

  return (
    <>
      <NextButton />
      <p className="user-name">{userInfo?.name || '暂无用户数据'}</p>
    </>
  );
};

4. App.js 保持原逻辑即可

你的App组件中Context Provider的实现是正确的,不需要修改。

这样改造后,点击按钮会调用service里的getUser请求数据,拿到数据后通过Context的setUserInfo更新状态,User组件就能实时展示用户名了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 01:40:41