如何使用功能组件将 API 数据渲染到 React Frontend 中?
我已成功使用 Node+Express+MSSQL 创建了后端 API,并使用 POSTMAN 测试了路由。现在最有挑战性的部分是,当我尝试使用 React Functional 组件/钩子将数据呈现到前端时,我遇到了一些错误。我不确定这是否是使用 API 将标签呈现到 React 页面的正确方法。此外,我确保我的表中没有重复的 ID,因为这可能会导致更多错误,并且它是一个可以从“KEY”属性中使用的唯一字段。
以下是尝试获取输出的 React 代码
import React, { useEffect, useState } from 'react'
import axios from 'axios'
import '../App.css';
const Ctms = (props) => {
const url = 'http://localhost:8090/api/ctms'
const [normac, setNormac] = useState()
useEffect(() => {
axios.get(url)
.then(response => {
console.log(response.data)
setNormac(response.data)
})
}, [url]);
if(normac) {
return(
<div>
{normac.map((ID,shop_order,item_number,item_desc,machine,supplier,feet_coil,Date_on,load_no,loadpc_signoff,pc_staff_load,unloadpc_signoff,pc_staff_unload,Date_off,ctms_id,complete) => (
<div key ={ID.value}>
<p key ={ID.value}>Shop Order : {shop_order.value}</p>
<p key ={ID.value}>Item Number : {item_number.value}</p>
<p key ={ID.value}>Item Desc : {item_desc.value}</p>
<p key ={ID.value}>Machine : {machine.value}</p>
<p key ={ID.value}>Supplier : {supplier.value}</p>
<p key ={ID.value}>Feet Coil : {feet_coil.value}</p>
<p key ={ID.value}>Date On : {Date_on.value}</p>
<p key ={ID.value}>Load Number : {load_no.value}</p>
<p key ={ID.value}>Load PC Signoff : {loadpc_signoff.value}</p>
<p key ={ID.value}>PC Staff Load : {pc_staff_load.value}</p>
<p key ={ID.value}>Unload PC Signoff : {unloadpc_signoff.value}</p>
<p key ={ID.value}>PC Staff Unload : {pc_staff_unload.value}</p>
<p key ={ID.value}>Date Off : {Date_off.value}</p>
<p key ={ID.value}>CTMS ID : {ctms_id.value}</p>
<p key ={ID.value}>Complete : {complete.value}</p>
</div>
))}
</div>
)}
return (
<h1>Check the KepServer tags!!!</h1>
)
}
export default Ctms;
示例 DB Fiddle
CREATE TABLE ctms (
ID INT,
shop_order NCHAR(20),
item_number NCHAR(20),
item_desc NCHAR(50),
machine NCHAR(10),
supplier NCHAR(20),
feet_coil NCHAR(10),
Date_on NCHAR(10),
load_no NCHAR(15),
loadpc_signoff NCHAR(10),
pc_staff_load NCHAR(10),
unloadpc_signoff NCHAR(10),
pc_staff_unload NCHAR(15),
Date_off NCHAR(10),
ctms_id NCHAR(15),
complete NCHAR(10)
);
INSERT INTO ctms (ID,shop_order,item_number,item_desc,machine,supplier,feet_coil,Date_on,load_no,loadpc_signoff,pc_staff_load,unloadpc_signoff,pc_staff_unload,Date_off,ctms_id,complete) VALUES (1,'SO 123456','0345678945','5/8X022 3T PREM COIL','NOR3','SPOTHER','1000','20220505','LOAD1','INSPECTED','AGLENN','INSPECTED','AGLENN','05/06/2022','ctms379669','y');
INSERT INTO ctms (ID,shop_order,item_number,item_desc,machine,supplier,feet_coil,Date_on,load_no,loadpc_signoff,pc_staff_load,unloadpc_signoff,pc_staff_unload,Date_off,ctms_id,complete) VALUES (1,'SO 456789','0345678945','5/8X022 3T PREM COIL','NOR3','SPOTHER','1000','20220505','LOAD1','INSPECTED','AGLENN','INSPECTED','AGLENN','05/06/2022','ctms379670','y');
INSERT INTO ctms (ID,shop_order,item_number,item_desc,machine,supplier,feet_coil,Date_on,load_no,loadpc_signoff,pc_staff_load,unloadpc_signoff,pc_staff_unload,Date_off,ctms_id,complete) VALUES (1,'SO 987654','0345678945','5/8X022 3T PREM COIL','NOR3','SPOTHER','1000','20220505','LOAD1','INSPECTED','AGLENN','INSPECTED','AGLENN','05/06/2022','ctms379671','y');
INSERT INTO ctms (ID,shop_order,item_number,item_desc,machine,supplier,feet_coil,Date_on,load_no,loadpc_signoff,pc_staff_load,unloadpc_signoff,pc_staff_unload,Date_off,ctms_id,complete) VALUES (1,'SO 654321','0345678945','5/8X022 3T PREM COIL','NOR3','SPOTHER','1000','20220505','LOAD1','INSPECTED','AGLENN','INSPECTED','AGLENN','05/06/2022','ctms379672','y');
我收到的错误( 错误参考 )
- 未捕获的 TypeError:无法读取未定义的属性(读取“值”)
- 组件中发生上述错误
您的
map
不太正确,JSX 中有几个地方需要修复。
尝试一下。
{normac.map(x => (
<div key={ID}>
<p>Shop Order : {x.shop_order}</p>
<p>Item Number : {x.item_number}</p>
<p>Item Desc : {x.item_desc}</p>
<p>Machine : {x.machine}</p>
<p>Supplier : {x.supplier}</p>
<p>Feet Coil : {x.feet_coil}</p>
<p>Date On : {x.Date_on}</p>
<p>Load Number : {x.load_no}</p>
<p>Load PC Signoff : {x.loadpc_signoff}</p>
<p>PC Staff Load : {x.pc_staff_load}</p>
<p>Unload PC Signoff : {x.unloadpc_signoff}</p>
<p>PC Staff Unload : {x.pc_staff_unload}</p>
<p>Date Off : {x.Date_off}</p>
<p>CTMS ID : {x.ctms_id}</p>
<p>Complete : {x.complete}</p>
</div>
))}
现在您有了
x
(作为对数组迭代中当前项目的引用),您可以在
map
主体中引用它。此处
x
将具有与
normac
中的对象属性相对应的属性,这些对象大概对应于数据库中的列名。
请注意,您也不需要在循环中的顶级元素之外的任何元素上使用
key
,因此您只需要在
<div>
上使用它。
回答您评论中的问题,如果您只想使用单个记录,则需要 1) 将从 db/api 返回的数据过滤为单个行/实体,或者 2) 仅引用
normac
中的单个项目,而不是通过数组进行映射。类似于
{normac.length > 0 && (
<div key={normac[0].ID}>
<p>Shop Order : {normac[0]..shop_order}</p>
<p>Item Number : {normac[0]..item_number}</p>
<p>Item Desc : {normac[0]..item_desc}</p>
<p>Machine : {normac[0]..machine}</p>
<p>Supplier : {normac[0]..supplier}</p>
<p>Feet Coil : {normac[0]..feet_coil}</p>
<p>Date On : {normac[0]..Date_on}</p>
<p>Load Number : {normac[0]..load_no}</p>
<p>Load PC Signoff : {normac[0]..loadpc_signoff}</p>
<p>PC Staff Load : {normac[0]..pc_staff_load}</p>
<p>Unload PC Signoff : {normac[0]..unloadpc_signoff}</p>
<p>PC Staff Unload : {normac[0]..pc_staff_unload}</p>
<p>Date Off : {normac[0]..Date_off}</p>
<p>CTMS ID : {normac[0]..ctms_id}</p>
<p>Complete : {normac[0]..complete}</p>
</div>
))}
此处,
normac.length
在实际尝试引用它之前会快速检查数组中是否有要引用的内容。如果没有它,当您的数据从
useEffect
中的 api 异步加载时,您可能会在尝试读取
undefined
属性时遇到问题。您需要根据要引用的数组中的哪个元素来调整该真实性检查。
如果您想使用
一些
数组值,那么您可以返回
normac.map()
,但首先过滤数组:
normac.filter(x => x.ID > 1).map(x => ({<div>...</div>});
据我了解,
normac
是一个对象数组
当您使用
.map
方法时,您可以访问
.map((el, index, array) => ...)
要获取所需的变量 (ID、shop_order、item_number...),您需要解构 map 回调的第一个参数:
.map(({ ID,shop_order,item_number... }) => ...)