react18【系列实用教程】双向绑定表单 (2024最新版)含受控组件、非受控组件、单行多行输入框 input,下拉选择 select,单选 radio,多选 checkbox,标签 label

简介: react18【系列实用教程】双向绑定表单 (2024最新版)含受控组件、非受控组件、单行多行输入框 input,下拉选择 select,单选 radio,多选 checkbox,标签 label

类似 vue 中的 v-model

受控组件

有value属性,将表单值的获取和更新都交由react中的state来管理的组件

import { useState } from "react";

export default function Father() {
  const [msg, setmsg] = useState("");
  const handleChange = (e) => {
    setmsg(e.target.value);
  };

  return (
    <div>
      <p> {msg}</p>
      <input type="text" value={msg} onChange={handleChange} />
    </div>
  );
}

非受控组件

没有value属性,通过操作DOM来获取表单数据的组件

import { useRef } from "react";

export default function Father() {
  const Ref_input = useRef(null);

  function getFileInfo() {
    console.log(Ref_input.current && Ref_input.current.files);
  }

  return (
    <div>
      <input type="file" ref={Ref_input} />
      <button onClick={getFileInfo}>获取文件信息</button>
    </div>
  );
}

单行输入框 input

<input value={msg} onChange={changeHandler} />
 
import { useState } from "react";
 
const [msg, setMsg] = useState("你好");

function changeHandler(e) {
  setMsg(() => e.target.value);
}

多行输入框 textarea

<textarea value={msg} onChange={changeHandler} />
 
import { useState } from "react";
 
const [msg, setMsg] = useState("你好");

function changeHandler(e) {
  setMsg(() => e.target.value);
}

下拉选择 select

<select value={city} onChange={changeHandler} >
  <option value="beijing">北京</option>
  <option value="shanghai">上海</option>
  <option value="wuhan">武汉</option>
</select>
import { useState } from "react";
const [city, setCity] = useState("beijing");

function changeHandler(e) {
    setCity(() => e.target.value);
}
const [city, setCity] = useState("beijing");

function changeHandler(e) {
    setCity(() => e.target.value);
}

单选 radio

<label htmlFor="radio_male">男</label>
<input id="radio_male" type="radio" name="gender" value='male' checked={gender === 'male'} onChange={changeHandler} />

<label htmlFor="radio_female">女</label>
<input id="radio_female" type="radio" name="gender" value='female' checked={gender === 'female'} onChange={changeHandler} />
import { useState } from "react";
 
const [gender, setGender] = useState('');

function changeHandler(e) {
    setGender(() => e.target.value);
}

多选 checkbox

<input id="checkbox_apple" type="checkbox" name="fruit" value='apple' checked={fruitList.includes('apple')} onChange={changeHandler} />
<label htmlFor="checkbox_apple">苹果</label>

<input id="checkbox_orange" type="checkbox" name="fruit" value='orange' checked={fruitList.includes('orange')} onChange={changeHandler} />
<label htmlFor="checkbox_orange">橘子</label>
import { useState } from "react";
 
  const [fruitList, setFruitList] = useState([]);

  function changeHandler(e) {
    let newValue = e.target.value;

    if (fruitList.includes(newValue)) {
      // 数组删除元素
      setFruitList(fruitList.filter((item) => item !== newValue));
    } else {
      // 数组新增元素
      setFruitList([...fruitList, newValue]);
    }
  }

标签 label

用 htmlFor 代替 for 来绑定其他表单元素

<label htmlFor="msgInput">消息:</label>
<input id="msgInput" value={msg} onChange={changeHandler} />
目录
相关文章
|
7月前
|
缓存 前端开发 JavaScript
React Hooks深度解析与最佳实践:提升函数组件能力的终极指南
🌟蒋星熠Jaxonic,前端探索者。专注React Hooks深度实践,从原理到实战,分享状态管理、性能优化与自定义Hook精髓。助力开发者掌握函数组件的无限可能,共赴技术星辰大海!
React Hooks深度解析与最佳实践:提升函数组件能力的终极指南
|
缓存 前端开发 数据安全/隐私保护
如何使用组合组件和高阶组件实现复杂的 React 应用程序?
如何使用组合组件和高阶组件实现复杂的 React 应用程序?
411 68
|
缓存 前端开发 Java
在 React 中,组合组件和高阶组件在性能方面有何区别?
在 React 中,组合组件和高阶组件在性能方面有何区别?
362 67
|
前端开发 JavaScript 安全
除了高阶组件和render props,还有哪些在 React 中实现代码复用的方法?
除了高阶组件和render props,还有哪些在 React 中实现代码复用的方法?
453 62
|
移动开发 前端开发 API
React 音频播放器组件 Audio Player
本文介绍如何使用React创建音频播放器组件,涵盖核心功能如播放/暂停、进度条、音量控制和时间显示。通过HTML5 `&lt;audio&gt;` 元素和React的声明式状态管理,实现交互式音频播放。常见问题包括控件不响应、进度条无法更新和音量控制失灵,并提供解决方案。此外,还讨论了浏览器兼容性、异步错误处理和性能优化等易错点及避免方法。
961 123
|
前端开发 JavaScript
除了使用Route组件,React Router还有其他方式处理404错误页面吗
除了使用Route组件,React Router还有其他方式处理404错误页面吗
511 58
|
前端开发
React 中高阶组件的原理是什么?
React 中高阶组件的原理是什么?
285 57
|
前端开发 开发者
除了函数组件和类组件,React 还有其他创建组件的方式吗?
除了函数组件和类组件,React 还有其他创建组件的方式吗?
238 57
|
前端开发
如何在React Router中定义404错误页面组件?
如何在React Router中定义404错误页面组件?
454 57
|
前端开发
在 React 中使用高阶组件时,如何避免命名冲突?
在 React 中使用高阶组件时,如何避免命名冲突?
330 56