开发者问题收集

如何使用功能组件将 API 数据渲染到 React Frontend 中?

2022-05-11
99

我已成功使用 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:无法读取未定义的属性(读取“值”)
  • 组件中发生上述错误
2个回答

您的 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>});

squillman
2022-05-11

据我了解, normac 是一个对象数组

当您使用 .map 方法时,您可以访问 .map((el, index, array) => ...)

要获取所需的变量 (ID、shop_order、item_number...),您需要解构 map 回调的第一个参数:

.map(({ ID,shop_order,item_number... }) => ...)

Guke Skl
2022-05-13