23-受控组件和双向绑定

Huxzhi大约 2 分钟react18

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
    });
};~