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

React中能否用多个useState?如何优化API请求后的状态赋值代码

在React中使用Axios请求API后,能否用多个useState设置数据?如何优化?

你完全可以像代码里那样使用多个useState,而且你的代码能正常运行就说明这种写法是有效的。不过从代码简洁性和可维护性来看,这种分散管理相关数据的方式确实有优化空间。

优化方案:合并为单个useState管理结构化数据

把分散的多个state合并成一个对象类型的state,集中管理所有和quiz相关的数据:

// 初始化一个包含所有需要字段的state对象
const [quizData, setQuizData] = useState({
  shareCode: '',
  createdBy: '',
  className: '',
  subjectName: '',
  avatar: '',
  startDate: '',
  endDate: '',
  quizStatus: ''
});

useEffect(() => {
  commonApiCall(`url${var}`, {}, 'get')
    .then((response) => {
      if (response.status_code === 200) {
        const quiz = response.response.quiz;
        // 一次性更新整个quizData对象
        setQuizData({
          shareCode: quiz.share_code,
          createdBy: quiz.created_by,
          className: quiz.class_id,
          // 用可选链避免字段不存在时抛出错误,同时设置默认值
          subjectName: quiz.subject_meta?.subject_name || '',
          avatar: quiz.image_avatar?.image_path || '',
          startDate: quiz.start_date,
          endDate: quiz.end_date,
          quizStatus: quiz.status
        });
      }
    })
    .catch((error) => {
      console.error(error);
    });
}, []);

优化的好处

  • 减少冗余代码:不用再重复声明多个useState,代码结构更紧凑
  • 数据集中管理:所有和quiz相关的状态都在一个对象里,后续维护、修改逻辑更清晰
  • 更高效的状态更新:虽然React会自动批量处理多个setState调用,但合并成一次更新能减少不必要的渲染触发(差异不大,但更符合最佳实践)
  • 扩展性更强:后续如果需要新增和quiz相关的字段,直接在state对象里添加即可,不用再新增useState

额外提示

如果接口返回的quiz对象字段和你需要的state字段大部分可以对应,也可以直接解构赋值,但要注意过滤掉不需要的字段,避免存储冗余数据:

setQuizData({
  shareCode: quiz.share_code,
  createdBy: quiz.created_by,
  className: quiz.class_id,
  ...(quiz.subject_meta && { subjectName: quiz.subject_meta.subject_name }),
  ...(quiz.image_avatar && { avatar: quiz.image_avatar.image_path }),
  startDate: quiz.start_date,
  endDate: quiz.end_date,
  quizStatus: quiz.status
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 10:54:18