You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在JSX中渲染两个JSON?含依赖API调用合并方案咨询

一步步搞定两次API调用合并与JSX渲染

没问题,我来帮你拆解这个需求,分两部分讲:先搞定两次API调用并合并数据,再说说怎么在JSX里渲染结果。

一、实现两次API调用并合并JSON数据

因为第二次API必须等第一次拿到itemtypeid才能发起,所以得用异步串行的逻辑,用async/await写最直观。

1. 先封装两个API请求函数

把两次请求分别封装成函数,方便复用和维护:

// 第一次请求:获取itemtypeid
async function getItemTypeId() {
  try {
    const res = await fetch('你的第一次API接口地址');
    if (!res.ok) throw new Error('第一次请求失败啦');
    const data = await res.json();
    return data.itemtypeid; // 假设接口返回的JSON里有这个字段,按实际调整
  } catch (err) {
    console.error('拿itemtypeid出错:', err);
    throw err; // 把错误抛出去让上层处理
  }
}

// 第二次请求:用拿到的id换类型名称
async function getTypeName(typeId) {
  try {
    // 这里假设API是用query参数传id,要是你的API是路径参数就改成 `/api/types/${typeId}`
    const res = await fetch(`你的第二次API接口地址?itemtypeid=${typeId}`);
    if (!res.ok) throw new Error('第二次请求失败啦');
    const data = await res.json();
    return data.typeName; // 假设接口返回的JSON里有类型名字段,按实际调整
  } catch (err) {
    console.error('拿类型名称出错:', err);
    throw err;
  }
}

2. 合并两次请求的结果

写一个主函数,先跑第一个请求拿id,再用id跑第二个请求,最后把数据合并成新的JSON:

async function fetchAndMergeData() {
  try {
    // 先拿id
    const itemTypeId = await getItemTypeId();
    // 再拿类型名称
    const typeName = await getTypeName(itemTypeId);
    // 合并成你需要的JSON结构,想加其他字段直接加就行
    const mergedData = {
      itemtypeid: itemTypeId,
      typeName: typeName
      // 要是第一次请求还有其他有用的字段,比如itemName,就改成 ...firstData, typeName: typeName
    };
    return mergedData;
  } catch (err) {
    console.error('合并数据出错:', err);
    // 这里可以加用户提示,或者返回默认值
    return null;
  }
}

要是第一次请求返回的是完整的对象,你也可以直接把整个对象保留,再追加类型名称:

async function fetchAndMergeData() {
  try {
    const firstRes = await fetch('你的第一次API地址');
    const firstData = await firstRes.json();
    const typeName = await getTypeName(firstData.itemtypeid);
    // 展开第一次的所有数据,再加类型名称
    const mergedData = { ...firstData, typeName };
    return mergedData;
  } catch (err) {
    console.error('合并数据出错:', err);
    return null;
  }
}

二、在JSX里渲染数据(React组件示例)

在React里,我们通常用useState存数据,useEffect触发异步请求,还要处理加载、错误状态,用户体验才好。

完整组件示例

import { useState, useEffect } from 'react';

// 把上面的fetchAndMergeData函数也放在这里,或者单独抽成工具文件
async function fetchAndMergeData() {
  // 这里放上面的合并逻辑
}

function ItemTypeInfo() {
  const [mergedData, setMergedData] = useState(null);
  const [isLoading, setIsLoading] = useState(true);
  const [errorMsg, setErrorMsg] = useState(null);

  // 组件挂载时发起请求
  useEffect(() => {
    const loadData = async () => {
      try {
        const data = await fetchAndMergeData();
        setMergedData(data);
      } catch (err) {
        setErrorMsg(err.message);
      } finally {
        setIsLoading(false); // 不管成功失败,都结束加载状态
      }
    };

    loadData();
  }, []); // 空数组确保只执行一次

  // 加载中状态
  if (isLoading) return <div>正在加载数据...</div>;
  // 错误状态
  if (errorMsg) return <div>哎呀,出错了:{errorMsg}</div>;
  // 没数据的情况
  if (!mergedData) return <div>暂无数据</div>;

  // 渲染拿到的合并数据
  return (
    <div className="item-type-container">
      <h2>物品类型详情</h2>
      <p><strong>类型ID:</strong>{mergedData.itemtypeid}</p>
      <p><strong>类型名称:</strong>{mergedData.typeName}</p>
      {/* 要是有其他字段,直接照着上面的格式加就行 */}
    </div>
  );
}

export default ItemTypeInfo;

几个小提醒

  • 记得处理加载、错误、空数据这几种状态,不然用户会一脸懵;
  • 如果你的API需要权限验证(比如token),要在fetch里加headers:
const res = await fetch('你的API地址', {
  headers: {
    'Authorization': 'Bearer ' + 你的token,
    'Content-Type': 'application/json'
  }
});
  • 第二次API的传参方式要跟后端对齐,是query参数、路径参数还是请求体,别写错了。

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

火山引擎 最新活动