<div className="form-row"><button className="btn btn-cyan";类型=按钮"onClick={handleSubmit}>Submit</button><button className="btn btn-cyan";类型=按钮"onClick={handleEdit}>UpdateData</button>
<div className="col-md-12"><div className="card mt-5"><div className="card-header blue-gradient text-white"><h4>表单详细信息</h4><div><div className="row mt-3"><div className="col"><div className="table table-hover table-striped text-center table-primary"><thead className="bg-dark text-white font-weight-bold"><tr><th>用户名</th><th>DropDownValue</th><th>性别</th><th>CheckboxValue</th><th>EDIT</th><th>DELETE</th></tr></thead>
{update.map(emp => {返回(<tr><td>{emp.UserName} </td><td>{emp.gender}</td><td>{emp.checking}</td><td><button className="btn btn-cyan font-weight-bold";onClick={()=>{editUser(emp)}}>编辑</button></td><td><button className="btn btn-green font-weight-bold";onClick={()=>{deleteUser(emp)}}>Delete</button></td></tr>)})}</tbody>
</React.Fragment >)}
解决方案
将状态更改为
const [data, setdata] = useState({用户名:",下拉:",性别:空,检查:[]});
更新处理程序以访问无线电和复选框 id
属性
const handleChange = (e) =>{if (e.target.name !== "gender" && e.target.name !== "checking") {setdata({ ...data, [e.target.name]: e.target.value });} else if (e.target.name === "gender") {让 allgenders = document.getElementsByName("gender");allgenders.forEach((allradio) => {如果(allradio.checked){setdata({ ...data, [e.target.name]: e.target.id });//<-- 获取输入id}});} else if (e.target.name === "checking") {让 getallCheckboxes = [];let allCheckboxes = document.getElementsByName("checking");allCheckboxes.forEach((allchecks) => {如果(allchecks.checked){getallCheckboxes.push(allchecks.id);//<-- 获取复选框ID}});setdata({ ...data, [e.target.name]: getallCheckboxes });}};
更新/添加 handleClear
以重置状态
handleClear = () =>{设置数据({用户名:",下拉:",性别:空,检查:[]});};
添加 id
属性并将 value
属性更改为 checked
并传递一个布尔值
性别: <span className="font-weight-bold"><标签>男性<输入id=男性"类型=收音机"名称=性别"选中={data.gender ===男性"}onChange={handleChange}/>标签></span><span className="font-weight-bold"><标签>女性<输入id=女性"类型=收音机"名称=性别"选中={data.gender ===女性"}onChange={handleChange}/>标签></span>...<label class="form-check-label";for=gridCheck">课程标签><br/><标签><输入id="HTML"类型=复选框"名称=检查"已检查={data.checking.includes(HTML")}onChange={handleChange}/>HTML标签><br/><标签><输入id=JavaScript"类型=复选框"名称=检查"已检查={data.checking.includes(JavaScript")}onChange={handleChange}/>JavaScript标签><br/><标签><输入id=ReactJS"类型=复选框"名称=检查"已检查={data.checking.includes(ReactJS")}onChange={handleChange}/>ReactJS标签><br/><标签><输入id=CSS"类型=复选框"名称=检查"已检查={data.checking.includes(CSS")}onChange={handleChange}/>CSS标签>
I am having a form, When I submit the data it is going to server and I displayed the data in a table..
In the Table I am having edit button, When clicked on Edit button, the data should bind to the Form.
Here I am unable to bind the Inputs fields, but not the Radio and Checkboxes...
const Form = () => {
const [data, setdata] = useState({
"UserName" : "",
"dropDown" :"",
"gender" : "",
"checking" :""
})
const [update, setUpdate] = useState([])
const handleChange =(e)=>{
if(e.target.name !=="gender" && e.target.name !=="checking"){
setdata({...data,[e.target.name]:e.target.value});
}else if(e.target.name ==="gender"){
let allgenders = document.getElementsByName("gender");
allgenders.forEach((allradio)=>{
if(allradio.checked){
setdata({...data,[e.target.name]:e.target.value});
}
})
}else if(e.target.name ==="checking"){
let getallCheckboxes =[];
let allCheckboxes =document.getElementsByName("checking");
allCheckboxes.forEach((allchecks)=>{
if(allchecks.checked){
getallCheckboxes.push(allchecks.value)
}
});
setdata({...data,[e.target.name]:getallCheckboxes});
}
}
useEffect(() => {
getAllData();
}, [])
const handleSubmit=(e)=>{
e.preventDefault();
// setUpdate({...data,update});
// console.log(data);
axios.post('http://localhost:3000/users',data).then((res)=>{
// console.log("user added successfully");
getAllData();
handleClear();
})
}
const getAllData=()=>{
axios.get('http://localhost:3000/users').then((res)=>{
setUpdate(res.data);
})
}
const deleteUser=(dating)=>{
console.log(dating);
axios.delete('http://localhost:3000/users/'+dating.id).then(res=>{
getAllData();
})
}
This is the Funtions for Edit and update,Here I am able to bind the Inputs fields, but not the Radio and Checkboxes...
const editUser=(userData)=>{
setdata(userData)
}
const handleEdit=()=>{
console.log(data);
axios.put('http://localhost:3000/users/'+data.id,data).then(res=>{
getAllData();
})
}
return (
<React.Fragment>
<h1>LordShiva</h1>
<div className="container mt-3">
<div className="row">
<div className="col-md-6">
<div className="card">
<div className="card-header bg-success text-white">
<h4>Form</h4>
<form>
<div className="form-group">
<input type="text" className="form-control" placeholder='UserName' name="UserName" value={data.UserName} onChange={handleChange} />
</div>
<div className="form-group">
<input name="phone" className="form-control" placeholder='PhoneNumber' name="PhoneNumber" value={data.PhoneNumber} onChange={handleChange} />
</div>
<div className="form-group">
<input name="email" className="form-control" placeholder='Email' value={data.email} onChange={handleChange} />
</div>
<div className="form-group">
<select name="dropDown" value={data.dropDown} onChange={handleChange} className="form-control" >
<option value=""></option>
<option value="Reactjs">ReactJS</option>
<option value="JS">JavaScript</option>
<option value="csCSSs">CSS</option>
<option value="HTML">HTML</option>
</select>
</div>
<div class="form-row">
<div className="form-group col-md-6">
<label className="font-weight-bold">Gender : </label>
<span className="font-weight-bold" > Male <input type="radio" name="gender" value={data.gender} onChange={handleChange}/></span>
<span className="font-weight-bold" > Female <input type="radio" name="gender" value={data.gender} onChange={handleChange} /></span>
</div>
<div class="form-check col-md-6">
<label class="form-check-label" for="gridCheck">Course</label><br />
<input type="checkbox" value="HTML" name="checking" value={data.checking} onChange={handleChange} /> HTML <br />
<input type="checkbox" value="JavaScript" name="checking" value={data.checking} onChange={handleChange} /> JavaScript <br />
<input type="checkbox" value="ReactJS" name="checking" value={data.checking} onChange={handleChange} /> ReactJS <br />
<input type="checkbox" value="CSS" name="checking" value={data.checking} onChange={handleChange} /> CSS <br />
</div>
<div className="form-row">
<button className="btn btn-cyan" type="button" onClick={handleSubmit}>Submit</button>
<button className="btn btn-cyan" type="button" onClick={handleEdit}>UpdateData</button>
</div>
</div>
</form>
</div>
</div>
</div>
<div className="col-md-12">
<div className="card mt-5">
<div className="card-header blue-gradient text-white">
<h4>FormDetails</h4>
<div>
<div className="row mt-3">
<div className="col">
<div className="table table-hover table-striped text-center table-primary">
<thead className="bg-dark text-white font-weight-bold">
<tr>
<th>UserName</th>
<th>DropDownValue</th>
<th>Gender</th>
<th>CheckboxValue</th>
<th>EDIT</th>
<th>DELETE</th>
</tr>
</thead>
<tbody>
{
update.map(emp => {
return(
<tr>
<td>{emp.UserName} </td>
<td>{emp.gender}</td>
<td>{emp.checking}</td>
<td><button className="btn btn-cyan font-weight-bold" onClick={()=>{editUser(emp)}}>Edit</button></td>
<td><button className="btn btn-green font-weight-bold" onClick={()=>{deleteUser(emp)}}>Delete</button></td>
</tr>
)
})
}
</tbody>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</React.Fragment >
)
}
解决方案
Change state to
const [data, setdata] = useState({
UserName: "",
dropDown: "",
gender: null,
checking: []
});
Update the handler to access the radio and checkbox id
attributes
const handleChange = (e) => {
if (e.target.name !== "gender" && e.target.name !== "checking") {
setdata({ ...data, [e.target.name]: e.target.value });
} else if (e.target.name === "gender") {
let allgenders = document.getElementsByName("gender");
allgenders.forEach((allradio) => {
if (allradio.checked) {
setdata({ ...data, [e.target.name]: e.target.id }); // <-- grab input id
}
});
} else if (e.target.name === "checking") {
let getallCheckboxes = [];
let allCheckboxes = document.getElementsByName("checking");
allCheckboxes.forEach((allchecks) => {
if (allchecks.checked) {
getallCheckboxes.push(allchecks.id); // <-- grab checkbox id
}
});
setdata({ ...data, [e.target.name]: getallCheckboxes });
}
};
Update/add handleClear
to reset the state
handleClear = () => {
setdata({
UserName: "",
dropDown: "",
gender: null,
checking: []
});
};
Add id
properties and change the value
prop to checked
and pass a boolean value
<label className="font-weight-bold">Gender : </label>
<span className="font-weight-bold">
<label>
Male
<input
id="male"
type="radio"
name="gender"
checked={data.gender === "male"}
onChange={handleChange}
/>
</label>
</span>
<span className="font-weight-bold">
<label>
Female
<input
id="female"
type="radio"
name="gender"
checked={data.gender === "female"}
onChange={handleChange}
/>
</label>
</span>
...
<label class="form-check-label" for="gridCheck">
Course
</label>
<br />
<label>
<input
id="HTML"
type="checkbox"
name="checking"
checked={data.checking.includes("HTML")}
onChange={handleChange}
/>
HTML
</label>
<br />
<label>
<input
id="JavaScript"
type="checkbox"
name="checking"
checked={data.checking.includes("JavaScript")}
onChange={handleChange}
/>
JavaScript
</label>
<br />
<label>
<input
id="ReactJS"
type="checkbox"
name="checking"
checked={data.checking.includes("ReactJS")}
onChange={handleChange}
/>
ReactJS
</label>
<br />
<label>
<input
id="CSS"
type="checkbox"
name="checking"
checked={data.checking.includes("CSS")}
onChange={handleChange}
/>
CSS
</label>
这篇关于无法在反应钩子中单击按钮时绑定单选按钮和复选框数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文