3 回答

TA貢獻2039條經驗 獲得超8個贊
我在這里粘貼了正確的代碼,使用擴展運算符在調用 setData 時提供先前數據的副本,這樣它的值就不會被覆蓋。
const [data, setData] = useState({
firstName: "",
lastName: "",
phoneNumber: "",
address: "",
imag: "",
});
// declear a new state varaible to store data
const [userData, setUserData] = useState([""]);
function handleChange(e) {
let name = e.target.name;
let value = e.target.value;
setData({
...data,
[name]: value,
});
}
function handleSubmit(e) {
e.preventDefault();
setUserData([...userData, data]);
}
console.log(userData);
return (
<>
<form id="form" className="needs-validation" onSubmit={handleSubmit}>
<div>
<input
className="imgFile"
type="text"
placeholder="First name"
value={data.firstName}
name="firstName"
onChange={handleChange}
/>
<input
className="imgFile"
type="text"
placeholder="Last name"
value={data.lastName}
name="lastName"
onChange={handleChange}
/>
<input
className="imgFile"
type="tel"
placeholder="Phone Number"
value={data.phoneNumber}
name="phoneNumber"
onChange={handleChange}
/>
<input
className="imgFile"
type="email"
placeholder="Email"
value={data.email}
name="email"
onChange={handleChange}
/>
<input
className="imgFile"
type="text"
placeholder="Address"
value={data.address}
name="address"
onChange={handleChange}
/>
<input
type="file"
name="img"
accept="image/*"
value={data.img}
onChange={handleChange}
/>
<button className="contactButton">Save </button>
</div>
</form>
</>
);
}

TA貢獻1785條經驗 獲得超8個贊
所以你的代碼很好,問題是當你使用時setData你會失去一切。在功能組件中你需要傳播oldData然后改變你喜歡的東西。
你setData應該在里面看起來像這樣handleChange:
setData(oldData => ({
...oldData,
[name]: value,
}));
比在您的提交表單中,您根本不需要userData,因為您可以使用包含data您需要的所有信息的對象。
你可以handleSubmit像這樣改變你的:
function handleSubmit(e) {
e.preventDefault();
console.log('data',data);
// do whatever with your "data", the object has all the information inside
}

TA貢獻1815條經驗 獲得超13個贊
執行此操作時忘記傳播 -data:
setData({
[name]: value,
});
應該是這樣的:
setData({
...data
[name]: value,
});
添加回答
舉報