如何在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




