【发布时间】:2021-09-24 00:12:21
【问题描述】:
我正在处理要在使用 JSON 占位符 API 的应用程序中执行的 CRUD 操作。我想使用 PUT 请求更新 API 的数据并将其显示回我的前端。我实际上是从用户端点获取数据。我无法执行 PUT 请求,也不知道在执行 PUT 请求后是否设置数组。我不断收到错误消息:单击保存更改后,userData.map() 不是函数。我知道在逻辑上不正确的获取操作之后我将单个对象设置为数组。我目前在用axios,也用了fetch(),但是没用。没有任何作用!请帮我解决这个问题。我附上下面的代码。 “handleSave”是我正在执行更改的函数。
非常感谢您!
import React, { useState, useEffect } from 'react';
import { v4 as uuidv4 } from 'uuid';
import axios from 'axios';
function Table() {
const [userData, setUserData] = useState([]);
const [clickOnEdit, setClickOnEdit] = useState(false);
const [index, setIndex] = useState("");
const [name, setName] = useState("")
const [username, setUsername] = useState("")
const [email, setEmail] = useState("")
const [phone, setPhone] = useState("")
const [website, setWebsite] = useState("")
useEffect(() => {
axios.get("https://jsonplaceholder.typicode.com/users").then((res) => {
setUserData(res.data);
})
},[])
const handleAddRow = () => {
setUserData([...userData,
{
id: uuidv4(),
name: "name",
username: "username",
email: "email",
phone: "phone",
website: "website"
}
])
}
const handleDelete = (item) => {
const id = item;
setUserData(userData.filter((individualItem) => individualItem.id !== id));
}
const handleEdit = (item) => {
const id = item;
setIndex(id);
setClickOnEdit(true);
}
const handleSave = (item) => {
setClickOnEdit(false);
axios.put(`https://jsonplaceholder.typicode.com/users/${item}`,
{
name: name,
username: username,
email: email,
phone: phone,
website: website
})
.then((res) => {
setUserData(res.data);
})
}
return (
<div>
<div>
<table>
<tr>
<th>Name</th>
<th>Username</th>
<th>Email</th>
<th>Phone</th>
<th>Website</th>
</tr>
</table>
</div>
<button onClick={(e) => handleAddRow(e)}>Add row</button>
{userData.map((items, id) => (
<div key={id} >
<table>
<tr>
{clickOnEdit ?
<div>
{index === id ?
<div>
<td><input value={name} name="name" onChange={(e) => setName(e.target.value)} /></td>
<td><input value={username} name="username" onChange={(e) => setUsername(e.target.value)} /></td>
<td><input value={email} name="email" onChange={(e) => setEmail(e.target.value) } /></td>
<td><input value={phone} name="phone" onChange={(e) => setPhone(e.target.value)} /></td>
<td><input value={website} name="website" onChange={(e) => setWebsite(e.target.value)} /></td>
<button onClick={() => handleSave(items.id)} >Save entry</button>
</div>
:
<div>
<td>{items.name}</td>
<td>{items.username}</td>
<td>{items.email}</td>
<td>{items.phone}</td>
<td>{items.website}</td>
<button onClick={(e) => handleEdit(items.id, e)} >Edit</button>
<button onClick={() => handleDelete(items.id)}>Delete</button>
</div>
}
</div>
:
<div>
<td>{items.name}</td>
<td>{items.username}</td>
<td>{items.email}</td>
<td>{items.phone}</td>
<td>{items.website}</td>
<button onClick={(e) => handleEdit(items.id, e)} >Edit</button>
<button onClick={() => handleDelete(items.id)}>Delete</button>
</div>
}
</tr>
</table>
</div>
))}
</div>
)
}
export default Table;
【问题讨论】:
-
只需确保您只更新 id 最大为 10 的用户资源。
-
是的@aitchkhan,我在 id 的范围内执行该功能。但没有任何效果。我认为我在 div 范围内做错了什么
标签: reactjs api axios react-hooks jsonplaceholder