reactjs - 在 ReactJS 中提交具有多个提交按钮的表单
问题描述
有一个输入元素,其值由用户给出。和 3 个按钮,其值来自各州。
因此,当我将输入值设置为“11”并按 SUBMIT1 按钮时,控制台中的输出应该是
{userId: "11", submit1: "1"}
相反,我也得到了整个提交值
{userId: "11", submit1: "1", submit2: "2", submit3: "3"}
另外,我收到了一个响应错误(第 23 行):我正在尝试发送一个 INPUT 值和一个提交值(被点击的按钮..)
PostForm.jsx 文件
import React, { Component } from "react";
import axios from "axios";
class PostForm extends Component {
constructor(props) {
super(props);
this.state = {
userId: "",
submit1: "1",
submit2: "2",
submit3: "3"
};
}
changeHandler = e => {
this.setState({ [e.target.name]: e.target.value });
};
submitHandler = e => {
e.preventDefault();
console.log(this.state);
axios
.post(
"https://jsonplaceholder.typicode.com/posts/${userId}/${submit}",
this.state
)
.then(response => {
console.log(response);
})
.catch(error => {
console.log(error);
});
};
render() {
const { userId, submit1, submit2, submit3 } = this.state;
return (
<div>
<form onSubmit={this.submitHandler}>
<div>
<input
type="text"
name="userId"
value={userId}
onChange={this.changeHandler}
/>
</div>
<button value={submit1} onChange={this.changeHandler} type="submit">
Submit1
</button>
<button value={submit2} onChange={this.changeHandler} type="submit">
Submit2
</button>
<button value={submit3} onChange={this.changeHandler} type="submit">
Submit3
</button>
</form>
</div>
);
}
}
export default PostForm;
解决方案
您需要从每个提交按钮的 onClick 方法调用提交方法,您的 jsonplaceholder 也有问题:您不需要在 POST 方法中发送整个路由....只需有效负载就足够了
此外,您不需要按钮上的 onChange 方法....我删除了它们。
import React, { Component } from "react";
import axios from "axios";
class PostForm extends Component {
constructor(props) {
super(props);
this.state = {
userId: "",
submit1: "1",
submit2: "2",
submit3: "3"
};
}
buildPayload = submitName => {
return { [`submit${submitName}`]: submitName, userId: this.state.userId };
};
changeHandler = e => {
this.setState({ [e.target.name]: e.target.value });
};
submitHandler = (submitName) => {
const payload = this.buildPayload(submitName);
console.log(payload);
axios
.post(`https://jsonplaceholder.typicode.com/posts`, payload)
.then(response => {
console.log(response);
// If you need the data here so do the following
console.log(response.data)
})
.catch(error => {
console.log(error);
});
};
render() {
const { userId, submit1, submit2, submit3 } = this.state;
return (
<div>
<form onSubmit={e => e.preventDefault()}>
<div>
<input
type="text"
name="userId"
value={userId}
onChange={this.changeHandler}
/>
</div>
<button
value={submit1}
onClick={() => this.submitHandler(this.state.submit1)}
>
Submit1
</button>
<button
value={submit2}
onClick={() => this.submitHandler(this.state.submit2)}
>
Submit2
</button>
<button
value={submit3}
onClick={() => this.submitHandler(this.state.submit3)}
>
Submit3
</button>
</form>
</div>
);
}
}
export default PostForm;
输出(在控制台中):
{userId: "11", submit1: "1"}
在控制台中
现在,如果您愿意,您还可以将提交方法重构为异步方法....只是为了使其更清洁:
submitHandler = async (submitName) => {
const payload = this.buildPayload(submitName);
const response = await axios.post(`https://jsonplaceholder.typicode.com/posts`, payload)
console.log(response.data);
};
推荐阅读
- excel - Matlab从excel中提取数据
- javascript - React Native 使用另一个函数循环返回多个 JSX 组件
- arrays - 从日期列表中提取日期并根据标准 VBA Access 打开/关闭参数
- identityserver4 - IdentityServer4重启后仍然登录
- python - 在python中循环文件时更改索引
- python - Pyinstaller 错误:传递规范文件时出现无法识别的参数
- c++ - 为什么 unique_ptr::release() 不释放分配的内存?
- c# - Microsoft.Jet.OLEDB.4.0“找不到表”异常
- mongodb - 如何在 Vert.x 中执行顺序 while 循环
- c# - C#从一个项目生成更多的exe