23-受控组件和双向绑定
大约 2 分钟
23-受控组件和双向绑定
受控组件
表单的所有功能包括输入、显示、提交全部都由 React 所处理。这种表单项在 React 中被称为受控组件,即表单项受 React 控制。当然也存在有不受控组件,但那种组件使用机会少且需要通过原生 DOM 去操作表单,并不建议使用,所以这里便不再赘述了。
双向绑定
我们可以将表单中的数据存储到 state 中,然后将 state 设置为表单项 value 值,这样当表单项发生变化,state 会随之变化,反之,state 发生变化,表单项也会跟着改变,这种操作我们就称为双向绑定
这样一来,表单就成为了一个受控组件
import React, {useState} from 'react';
import Card from "../UI/Card/Card";
import './LogsForm.css';
const LogsForm = () => {
/*
* 当表单项发生变化时,获取用户输入的内容
* */
// 创建三个变量,用来存储表单中的数据
const [inputDate, setInputDate] = useState('');
const [inputDesc, setInputDesc] = useState('');
const [inputTime, setInputTime] = useState('');
// 创建一个响应函数,监听日期的变化
const dateChangeHandler = (e) => {
// 获取到当前触发事件的对象
// 事件对象中保存了当前事件触发时的所有信息
// event.target 执行的是触发事件的对象(DOM对象)
setInputDate(e.target.value);
};
// 监听内容的变化
const descChangeHandler = (e) => {
setInputDesc(e.target.value);
};
//监听时长的变化
const timeChangeHandler = (e) => {
setInputTime(e.target.value);
};
// 当表单提交时,汇总表单中的数据
/*
* 在React中,通常表单不需要自行提交
* 而是要通过React提交
* */
const formSubmitHandler = (e) => {
// 取消表单的默认行为
e.preventDefault();
// 获取表单项中的数据日期、内容、时长
// 将数据拼装为一个对象
const newLog = {
date: new Date(inputDate),
desc: inputDesc,
time: +inputTime
};
// 清空表单项
setInputDate('');
setInputDesc('');
setInputTime('');
console.log(newLog);
};
return (
<Card className="logs-form">
<form onSubmit={formSubmitHandler}>
<div className="form-item">
<label htmlFor="date">日期</label>
<input onChange={dateChangeHandler} value={inputDate} id="date" type="date"/>
</div>
<div className="form-item">
<label htmlFor="desc">内容</label>
<input onChange={descChangeHandler} value={inputDesc} id="desc" type="text"/>
</div>
<div className="form-item">
<label htmlFor="time">时长</label>
<input onChange={timeChangeHandler} value={inputTime} id="time" type="number"/>
</div>
<div className="form-btn">
<button>添加</button>
</div>
</form>
</Card>
);
};
export default LogsForm;
将表单数据统一到一个 state 中
const [formData, setFormData] = useState({
inputDate:'',
inputDesc:'',
inputTime:''
});
// 创建一个响应函数,监听日期的变化
const dateChangeHandler = (e) => {
// 注意需要 浅复制
setFormData({
...formData,
inputDate: e.target.value
});
};~