TypeError:无法访问属性“map”,data.record 未定义

Posted

技术标签:

【中文标题】TypeError:无法访问属性“map”,data.record 未定义【英文标题】:TypeError: can't access property "map", data.record is undefined 【发布时间】:2021-06-23 23:30:28 【问题描述】:

我正在尝试使用 reactjs 和 node js 以及 mysql 数据库添加和更新数据。这是我的代码。

为了连接,我在节点 js 中创建了 REST API。

连接成功实现。

这是我的前端代码

用于向数据库添加数据

const App1 = () =>

const [data,setData] = useState(
    name: '',
    location: '',
    record: [],
    showAlert: false,
    alertMsg: "",
    alertType: "success",
    id:"",
    update: false,
 );

useEffect(()=>
  fetchData(); 
,[]);

// const [location,setLocation] = useState(location: '');

const InputEvent = (event) =>
    const name, value = event.target;
    setData((preValue)=>
        return
            ...preValue,
            [name]: value,
        ;
    );
;

    const addData = () =>
    var myHeaders = new Headers();
   myHeaders.append("Content-Type","application/json")

   var body = JSON.stringify(name: data.name, location: data.location);

   fetch("http://localhost:8000/api/create",
       method: "POST",
       headers: myHeaders,
       body: body
   ).then((res)=>res.json())
    .then((result)=>
        console.log(result);
        
        setData(
            name:"",
            location: "",
            showAlert: true,
            alertMsg: result.res,
            alertType: "success",
            record: result.res,
        );
    );
;

用于从数据库中获取所有记录

    const fetchData = () =>
    var headers = new Headers();
    headers.append("Content-Type","application/json");

    fetch("http://localhost:8000/api/view",
        method: "GET",
        headers: headers,
).then((res)=>res.json())
.then((result)=>
    console.log("result",result);

    setData(
        record: result.res,
    )
).catch((err)=> console.log("Error",err));

对于在此编辑数据库中的数据,我面临编辑数据的问题,因为当单击编辑按钮时,数据库中的数据已更新但前端发生错误 =“无法访问属性” map", data.record 未定义"

编辑功能代码

const editTask = (id) =>
fetch("http://localhost:8000/api/view/"+id,
    method: "GET",
).then((res)=>res.json())
.then((result)=>
    console.log(result);

    setData(
        id: id,
        update: true,
        record: result.res,
        name: result.res[0].name,
        location: result.res[0].location,
    );
).catch((err)=>console.log("Error",err));;

现在来更新部分

这里是更新函数发生同样的错误="TypeError: can't access property "map", data.record is undefined

更新函数如下

 const updateTask = () =>
  var myHeaders = new Headers();
  myHeaders.append("Content-Type","application/json");

  var body = JSON.stringify(id: data.id, name: data.name, location: data.location);
  fetch("http://localhost:8000/api/update",
      method: "PUT",
      headers: myHeaders,
      body: body
  ).then((res)=>res.json())
  .then((result)=>

    console.log(result);
      setData(
          showAlert: true,
          alertMsg: result.res,
          alertType: "success",
          update: false,
          id: "",
          name: "",
          location: "",
      );
          fetchData();
  ).catch((err)=>console.log("Error",err));;

现在来返回我写map方法代码的部分

data.record.map((record)=>
                            return(
                                
                                <tr>
                                    <td>record.id</td>
                                    <td>record.name</td>
                                    <td>record.location</td>

                                    <td>
                                       <Button variant="info"onClick()=>editTask(record.id)>Edit</Button>
                                    </td>

                                    <td>
                                        <Button variant="danger">Delete</Button>
                                    </td>
                                </tr>
                            );

请帮帮我,谢谢

【问题讨论】:

你在哪里使用data.record.map?请分享整个文件,而不是其中的一部分,因为最重要的部分是单独的...... 你正在改变你的状态结构。首先它是一个包含所有数据的状态,但是您的编辑和更新操作会将您的状态集合更改为来自 api 的单个记录。 【参考方案1】:

您在更新后传递给 setData 的对象没有“记录”数据。因此,它变得未定义。

setData(
  showAlert: true,
  alertMsg: result.res,
  alertType: "success",
  update: false,
  id: "",
  name: "",
  location: "",
);

假设您的更新 api 返回更新的数据,您将需要使用更新的数据更新您的“记录”数据

fetch("http://localhost:8000/api/update", 
  method: "PUT",
  headers: myHeaders,
  body: body
)
.then((res) => res.json())
.then((result) => 
  setData(
    showAlert: true,
    alertMsg: result.res,
    alertType: "success",
    update: false,
    id: "",
    name: "",
    location: "",
    record: data.record.map(item => (item.id === result.id ? result : item)
  );
);

【讨论】:

以上是关于TypeError:无法访问属性“map”,data.record 未定义的主要内容,如果未能解决你的问题,请参考以下文章

Vue警告]:渲染错误:“TypeError:无法读取未定义的属性'map'”Vue Google地图[重复]

TypeError:无法读取未定义的属性'map'| ReactJS

TypeError:无法读取React BeatifulDnD上未定义的属性'map'

TypeError:无法读取未定义的属性“地图”。找不到解决办法

Graphql,React - TypeError:无法读取未定义的属性“地图”

TypeError:无法读取未定义的 React Hooks 的属性“地图”