javascript - 如何使用 React 和 Express 以类似 Ajax 的方式提交表单?
问题描述
我有一个我想提交的表格。但是,不是在提交后重新加载页面,我只是希望以类似 Ajax 的方式提交表单。
也就是说,我要发送数据并让服务器响应,但页面要留在浏览器中。
相关的前端 React 代码如下所示:
handleSubmission = (event) => {
// event.preventDefault();
console.log('form submitted');
}
render () {
return (
// ... snip
<form onChange = {this.handleChange} onSubmit = {this.handleSubmission} action = "/articles/add" method="POST">
更新:
我在这里找到了这个教程,它使用了一些叫做 FormData 的东西:
handleSubmit(event) {
event.preventDefault();
const data = new FormData(event.target);
// NOTE: you access FormData fields with `data.get(fieldName)`
const [month, day, year] = data.get('birthdate').split('/');
const serverDate = `${year}-${month}-${day}`;
data.set('birthdate', serverDate);
data.set('username', data.get('username').toUpperCase());
fetch('/api/form-submit-url', {
method: 'POST',
body: data,
});
}
更新:
表单上的 React 文档显示了 preventDefault 的使用,但没有显示实际提交是如何完成的。
更新
MDN 涵盖表单提交,但不涵盖 preventDefault 方法。见这里。
解决方案
有几种方法可以做到这一点。react 文档没有解释如何执行此操作,因为它不是 reacts'responsibility 这样做。您可以使用上面示例中所写的 fetch API,也可以使用 Axios 等其他库。您应该如何格式化要发送到服务器的数据(具体路由如何期望数据被格式化)。
基本上,在提交句柄方法中,您应该首先使用 event.preventDefault() 防止默认行为。然后您应该正确格式化您的数据以发送到服务器。在 React 中,大多数表单对每个输入都有一个 onChange 方法,该方法不断更新组件的状态以匹配每个输入中的值,因此在您提交表单时,您的数据已经存储在组件的状态中。最后,您应该将请求作为发布请求发送到正确的 URL,并在服务器响应时创建回调函数。您可以使用 async/await 或使用 promise 中使用的函数 then() 来执行此操作。为简单起见,我们将使用 then()。
例子
class NameForm extends React.Component {
constructor(props) {
super(props);
this.state = {firstName: '', lastName: ''};
this.handleChange = this.handleChange.bind(this);
this.handleSubmit = this.handleSubmit.bind(this);
}
handleChange(event) {
this.setState({[event.target.name]: event.target.value});
}
handleSubmit(event) {
event.preventDefault();
const data = this.state;
fetch(YOUR_URL, { method: 'POST', body: data })
.then(response => response.json())
.then(data => console.log(data));
}
render() {
return (
<form onSubmit={this.handleSubmit}>
<label>
First Name:
<input type="text" value={this.state.firstName} onChange={this.handleChange} />
Last Name:
<input type="text" value={this.state.lastName} onChange={this.handleChange} />
</label>
<input type="submit" value="Submit" />
</form>
);
}
}
推荐阅读
- javascript - 通过php ul列表循环中的单击事件添加和删除标签的类
- javascript - 引导表单验证不适用于 ajax
- python - 消费者 Kafka 通过 Rest Proxy 和 python
- swift - 如何让 swiftui 等到元素完成退出转换,然后再更新它所在的列表?
- flutter - 颤振 Mockito。模拟失败
- php - PHP 代码不工作,从 POST 作为 XML 接收数据,
- amazon-web-services - AWS Athena Drop View 中文命名
- python - 给定表替换子字符串的最佳方法
- reactjs - 在 next.js 中访问 localStorage
- ruby-on-rails - 如何在视图中仅显示任务模型的范围实例