【发布时间】:2021-04-10 16:41:07
【问题描述】:
我只是想知道是否有人能指出我的代码哪里出错了。 我对反应比较陌生,所以从一个简单的待办事项列表开始。 然后我对其进行了编辑以允许各种其他形式,例如菜单、配置文件等。 下面是菜单部分的附加代码。 如果我使用 postmaster,我的后端就可以工作,这让我相信它是我的前端,特别是我的 useState。 我可以调用数据并在我的模式中查看它,但它似乎无法编辑表单字段中的特定数据和/或将其发布到我的数据库。
任何帮助将不胜感激。
我在下面附上了我的代码。
import React, { Fragment, useState } from "react";
const EditMenu = ({ menu }) => {
//editText function
const [inputs, setInputs] = useState(menu.item_title, menu.item_price, menu.item_description, menu.item_category);
const { title, category, price, description } = inputs;
const onChange = e =>
setInputs({ ...inputs, [e.target.name]: e.target.value });
const editMenuItem = async (item_id) => {
try {
const body = { title, category, price, description };
const res = await fetch(`http://localhost:5000/menu/${item_id}`, {
method: "PUT",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(body)
});
window.location = "/admin";
} catch (error) {
console.error(error.message);
}
};
return (
<Fragment>
<button type="button" className="btn btn-warning" data-toggle="modal" data-target={`#id${menu.item_id}`}>Edit</button>
{/*id = "id21"*/}
<div className="modal" id={`id${menu.item_id}`} onClick={() => setInputs(menu.item_title, menu.item_price, menu.item_description, menu.item_category)}>
<div className="modal-dialog">
<div className="modal-content">
<div className="modal-header">
<h4 className="modal-title">Edit Menu</h4>
<button className="close btn-danger" data-dismiss="modal" onClick={() => setInputs(menu.item_title, menu.item_price, menu.item_description, menu.item_category)}>×</button>
</div>
<div className="modal-body">
<input type="text" name="title" placeholder="Title" className="form-control my-3" value={menu.item_title} onChange={e => onChange(e)} />
<input type="tel" name="price" placeholder="Price" className="form-control my-3" value={menu.item_price} onChange={e => onChange(e)} />
<input type="text" name="description" placeholder="Description" className="form-control my-3" value={menu.item_description} onChange={e => onChange(e)} />
<input type="text" name="category" placeholder="Category" className="form-control my-3" value={menu.item_category} onChange={e => onChange(e)} />
</div>
<div className="modal-footer">
<button type="button" className="btn btn-warning" data-dismiss="modal" onClick={() => editMenuItem(menu.item_id)}>Edit</button>
<button type="button" className="btn btn-danger" data-dismiss="modal" onClick={() => setInputs(menu.item_title, menu.item_price, menu.item_description, menu.item_category)}>Close</button>
</div>
</div>
</div>
</div>
</Fragment>
);
};
更新, 到目前为止,我已经使用以下答案尝试了各种建议的修复。 这两个修复程序都允许表单字段是可编辑的,并且表单字段中的信息会发生变化,因此状态也会发生变化,但是它不会发送到数据库。刷新页面后,从数据库中提取旧信息。
我发现如果我删除了除一个以外的所有表单字段,它会成功更新并发送到数据库。 标题或描述或价格或类别。 在更新时检查浏览器中的网络选项卡表明,对于多个输入字段,放置请求失败并且没有信息/有效负载发送到请求选项卡中的正文。
因此,数据库返回 NOT NULL 错误。 根据下面 Oliviers 的回答,setInput 仅识别一个参数,我只能想象当添加了多个表单字段/输入时,这就是中断的原因。不幸的是,我不知道是否有足够的反应。
【问题讨论】:
-
好问题!您尝试过什么来解决您的问题?
-
我根据以下答案更新了我的 useState 格式。这允许meet 编辑信息。如果我再次尝试编辑,表单中的信息仍然会更改,但是在刷新时,旧信息仍会从数据库中提取。新信息不会发送给它。 item_title 列中出现非空错误。检查命名约定并删除除一个以外的所有字段后,它确实有效,但只有标题或描述或价格。下面的 Olivier 说我的 setInputs 只接受一个参数,所以我想这就是原因。目前正在努力解决这个问题。
-
您能否将您尝试的内容添加到您的问题中,而不是将其添加为评论?我相信 Olivier Boissé 的回答可能会奏效。他们在回答中建议使用对象作为您的输入。
-
没问题。道歉。我更新了问题中的代码部分以反映 Olivier 建议的更改,并删除了 MenuList 代码,因为它似乎与问题无关。
-
干杯。介意我问Overkill如何?我还没有设法找到解决方案,因为提供的答案没有奏效。任何帮助都可能使我朝着正确的方向前进。
标签: reactjs react-hooks crud use-state