node.js - 无法使用表单 Reactjs 和 MongoDB 编辑和更新属性
问题描述
所以我正在使用 Nodejs、MongoDB 和 Reactjs,我正在尝试编辑项目的属性。我有多个项目,当我想编辑一个项目的属性时,我做不到。我们可以访问输入中的属性,我们可以看到 Title 和 Type 但甚至无法删除、写入,他通过其 ID 访问属性但我无法更改它,我想我在这里有多个问题。
当我说我什至无法更改输入的任何内容时,我将在这里写我的服务器代码、我的编辑/更新项目页面和一个带有示例的 gif。
我的服务器代码:
//Render Edit Project Page byId
app.get('/dashboard/project/:id/edit', function(req, res){
let id = req.params.id;
Project.findById(id).exec((err, project) => {
if (err) {
console.log(err);
}
res.json(project);
});
}
//Update Projects Properties byId
app.put('/dashboard/project/:id/edit', function(req, res){
var id = req.params.id;
var project = {
title: req.body.title,
typeOfProduction: req.body.typeOfProduction
};
Project.findByIdAndUpdate(id, project, {new: true},
function(err){
if(err){
console.log(err);
}
res.json(project);
})
};
我的 React 组件编辑项目页面
import React, { Component } from 'react';
import { NavLink } from 'react-router-dom';
import './EditProject.css';
class EditProject extends Component {
constructor(props){
super(props);
this.state = {
//project: {}
title: '',
typeOfProduction: ''
};
}
inputChangedHandler = (event) => {
const updatedProject = event.target.value;
}
componentDidMount() {
// console.log("PROPS " + JSON.stringify(this.props));
const { match: { params } } = this.props;
fetch(`/dashboard/project/${params.id}/edit`)
.then(response => { return response.json()
}).then(project => {
console.log(JSON.stringify(project));
this.setState({
//project: project
title: project.title,
typeOfProduction: project.typeOfProduction
})
})
}
render() {
return (
<div className="EditProject"> EDIT
<form method="POST" action="/dashboard/project/${params.id}/edit?_method=PUT">
<div className="form-group container">
<label className="form--title">Title</label>
<input type="text" className="form-control " value={this.state.title} name="title" ref="title" onChange={(event)=>this.inputChangedHandler(event)}/>
</div>
<div className="form-group container">
<label className="form--title">Type of Production</label>
<input type="text" className="form-control " value={this.state.typeOfProduction} name="typeOfProduction" ref="typeOfProduction" onChange={(event)=>this.inputChangedHandler(event)}/>
</div>
<div className="form-group container button">
<button type="submit" className="btn btn-default" value="Submit" onClcik={() => onsubmit(form)}>Update</button>
</div>
</form>
</div>
);
}
}
export default EditProject;
我有错误:
1- DeprecationWarning:collection.findAndModify 已弃用。请改用 findOneAndUpdate、findOneAndReplace 或 findOneAndDelete。
2-输入不能改变
解决方案
首先,关于弃用警告,您需要将方法 findAndModify (我在这里看不到,我猜您在其他地方使用它,或者您使用的方法之一正在调用它)更改方法之一建议的方法并相应地更改您的代码。
然后,您需要了解 React 和受控组件:https ://reactjs.org/docs/forms.html
您需要在 onChange 处理程序中设置组件的状态,例如:
this.setState({
title: event.target.value // or typeOfProduction, depending on wich element fired the event
});
这在 React 中称为受控组件。
关于单击更新按钮时获得的响应正文,这实际上是您要求的:
res.json(project);
将项目变量作为 JSON 文件返回,该文件显示在您的屏幕截图中。
有关它的更多信息,请参阅此问题:Proper way to return JSON using node or Express
推荐阅读
- kubernetes - 节点没有用于请求的 pod 端口的空闲端口
- vue.js - 如何使 vuetify 工具提示内容可点击?
- c++ - Crypto++中的椭圆曲线点算术
- azure-devops-server - 如何将板列映射到 Azure Devops Server 中的自定义状态
- java - 如何使用 java 向 IBM MQ 发送 ack 消息
- oracle-apex - Oracle Apex SQL Workshop - 新行(CHR10)在 varchar DB 列中不起作用
- python - 尝试调用 tensorflow-hub 的预测方法时,在邮递员中找不到错误 404
- docker - 如何限制 docker swarm 中每个节点运行的最大容器数
- javascript - 鸭子键入未知对象时处理 null 的问题
- laravel - Laravel:有些东西正在改变方法,它是什么?