• react之处理用户表单输入


    首先我们要明白什么时候要获取表单数据——当表单项发生变化时。

    以下面的表单为例说明:

    1. <div className="form-item">
    2. <label htmlFor="date">日期label>
    3. <input onChange={dateChangeHandler} id="date" type="date"/>
    4. div>
    5. <div className="form-item">
    6. <label htmlFor="desc">内容label>
    7. <input onChange={descChangeHandler} id="desc" type="text"/>
    8. div>
    9. <div className="form-item">
    10. <label htmlFor="time">时长label>
    11. <input onChange={timeChangeHandler} id="time" type="number"/>
    12. div>
    13. <div className="form-btn">
    14. <button>添加button>
    15. div>

    第一种原始DOM方法

    1. const descChangeHandler = () => {
    2. console.log("DOM方式获取: ", document.getElementById('desc').value);
    3. };

    第二种使用useRef

     似乎好像也没简便多少。

    1. const descRef = useRef();
    2. const descChangeHandler = () => {
    3. console.log("useRef获取: ", descRef.current.value);
    4. };

      

     

    第三种原生事件对象(推荐)

    1. // 监听内容的变化
    2. const descChangeHandler = (e) => {
    3. // 获取到当前触发事件的对象 e;e 中保存了当前事件触发时的所有信息
    4. // event.target 执行的是触发事件的对象(DOM对象)
    5. console.log(e.target.value);
    6. };

     表单项数据填好后,需要汇总再提交至服务器。

    1. ......

    通过监听表单onSubmit方法来提交,而通常表单不需要自行提交,由react帮你提交(异步)。

    1. // 创建三个变量,用来存储表单中的数据
    2. let inputDate = ''; // 日期
    3. let inputDesc = ''; // 描述
    4. let inputTime = 0; // 时长

     然后分别在input框绑定的监听函数中通过事件对象赋值对应的输入值value。 

    1. const formSubmitHandler = (e) => {
    2. // 取消表单的默认行为
    3. e.preventDefault();
    4. // 获取表单项中的数据日期、内容、时长
    5. // 将数据组装为一个对象
    6. const newLog = {
    7. date: new Date(inputDate),
    8. desc: inputDesc,
    9. time: +inputTime
    10. };
    11. console.log(newLog);
    12. };

    问题:表单提交成功,如何清空/重置表单项的旧数据?

    非受控组件:说白了,就是只能通过DOM操作的表单元素。

    受控组件:表单项的value受到react的state的控制管理(类似Vue中的v-model)。

     我们可以将表单中的数据存储到state中,然后将state的数据设置为表单项value值。

    将非受控组件元素交由state管理:

    1. const [inputDate, setInputDate] = useState('');
    2. const [inputDesc, setInputDesc] = useState('');
    3. const [inputTime, setInputTime] = useState('');
    1. "date" type="date"/>
    2. <input onChange={descChangeHandler} value={inputDesc} id="desc" type="text"/>
    3. <input onChange={timeChangeHandler} value={inputTime} id="time" type="number"/>

    然后再在监听函数中调用setXXX方法获取用户输入,当表单项发生变化,state会随之变化; 反之,state发生变化,表单项也会跟着改变,这种操作称为双向绑定(个人感觉v-model真香)。

    如此一来,表单就成为了一个受控组件了。

    另外我们也可以将表单数据集中到一个state中:

    1. const [formData, setFormData] = useState({
    2. inputDate:'',
    3. inputDesc:'',
    4. inputTime:''
    5. });

    监听函数的setXXX需改写成对象展开形式:

    1. setFormData({
    2. ...formData,
    3. inputDate: e.target.value
    4. });

    当然还可以再精简点,这里可以只用一个函数来监听所有的input元素,给每个input设置id,通过id和保存的数据的属性名一样就可以。

  • 相关阅读:
    3dmax如何在渲染完之后加载VFB的参数和LUT文件?
    防火墙的内容安全
    Python pywin32实现word和Excel的处理
    Linux常用命令——find命令大全
    学习一下 常说的防抖
    Bean作用域和生命周期-------JavaEE(Spring)
    牛客网论坛最具争议的Java面试成神笔记,GitHub已下载量已过百万
    java处理异常这一篇就够了
    剪映failed to initialize,cuda.is_available()为false解决
    2022年上半年软设算法题代码
  • 原文地址:https://blog.csdn.net/weixin_45719444/article/details/127715706