起因, 目的:
表单其实,有点复杂,因为涉及事件,event.
不熟悉的代码,还是尽量手写,不然的话,AI 生成的东西,自己看不懂。
例1 普通, 直接的方法
一个输入框,一个处理函数。
import { useState } from "react";
// 使用 form, 表单
function App() {
const [username, setUsername] = useState("friend!");
const [password, setPassword] = useState("123!");
function handleUsernameChange(event) {
// 理解 event.target.value
// target 是 input 标签,
// value 是用户输入的值
// 同理,还可以打印出其他属性,
// 如 event.target.name, event.target.type 等
console.log("Username changed: ", event.target.value);
// console.log("event.target.name: ", event.target.name);
// console.log("event.target.type: ", event.target.type);
}
function handlePasswordChange(event) {
console.log("Password changed: ", event.target.value);
}
return (
<form>
<input type="text" name="username" placeholder="Your name" onChange={handleUsernameChange} />
<input type="password" name="password" placeholder="Password" onChange={handlePasswordChange} />
</form>
);
}
export default App;
onChange 这个函数确实很有用,用户调试代码很不错。
例2 用一个函数来处理表单
import { useState } from "react";
// 使用 form, 表单
function App() {
// 用一个 state 来处理整个表单。
const [formData, setFormData] = useState({username: "", password: ""});
console.log("formData changed: ", formData);
function handleChange(event) {
setFormData(prevFormData => {
return {
...prevFormData, // 复制 prevFormData 对象
// 这里如果不加 [] 会报错。
// [event.target.name] 表示动态计算出这个字段的名字, 作为对象的 key
[event.target.name]: event.target.value // 更新对应字段
}
})
}
// 如果要使用 一个函数来处理表单,每个字段都加上 name 属性
return (
<form>
<input type="text" name="username" placeholder="Your name" onChange={handleChange} />
<input type="password" name="password" placeholder="Password" onChange={handleChange} />
</form>
);
}
export default App;