react from表单初探

简介: 表单大家都很清楚,input 框,select, radio 等, 在 vue 中的表单数绑定使用的是 v-model, v-model 是啥,一个语法糖,用于双向数据绑定而已,在react 中是没有这样的语法糖的,需要自己来手动实现

表单大家都很清楚,input 框,select, radio 等, 在 vue 中的表单数绑定使用的是 v-model, v-model 是啥,一个语法糖,用于双向数据绑定而已,在react 中是没有这样的语法糖的,需要自己来手动实现


受控组件和非受控组件


受控组件:组件的使用者,有能力完全控制该组件的行为和内容。通常情况下,受控组件往往没有自身的状态,其内容完全收到属性的控制。


非受控组件:组件的使用者,没有能力控制该组件的行为和内容,组件的行为和内容完全自行控制。


在react 表单组件中,默认情况下是非受控组件,一旦设置了表单组件的value属性,则其变为受控组件(单选和多选框需要设置checked)


input


效果: 和 vue 一样,双向数据绑定,但是这个并没有特殊的语法糖


20210223152719250.gif


封装的代码如下:


Input.tsx


import React from 'react'
/**
 * input 的属性
 */
interface IInputP {
  /**
   * 属性值
   */
  value: any,
  /**
   * 表单的属性名字
   */
  name: string,
  /**
   * 输入框改变的函数
   */
  onChange: (value: any, name: string, e: React.ChangeEvent<HTMLInputElement>) => void;
}
export default function Input(props: IInputP) {
  return (
    <>
      <input
        type="text"
        value={props.value}
        name={props.name}
        onChange={e => props.onChange(e.target.value, props.name, e)}
      />
    </>
  )
}


使用方式


import React, { Component } from 'react'
import Input from '.'
interface IInputTestS {
  /**
  * 属性值
  */
  value: any,
}
export default class InputTest extends Component<{}, IInputTestS> {
  state:IInputTestS = {
    value: 1
  }
  change = (v: any) => {
    this.setState(pre => ({
      value: v
    }))
  }
  render() {
    return (
      <div>
        <Input value={this.state.value} name='test' onChange={this.change}></Input>
      </div>
    )
  }
}


这个数据绑定和 vue 的原理是一样的,都是通过 元素的 value 值 和 change 事件来进行双向数据绑定的,只是vue 中提供了特殊的语法糖 v-model


radio, select


实现方法和上面的input 是一样的


checkbox


这个的实现方式有点不一样,多选传入的肯定是一个数组


封装的代码如下:


CheckboxGroup .tsx


import React, { Component } from 'react'
/**
 * 每一个radio的对象类型
 */
type checkboxObj = {
  value: string ,
  label: string | number
}
interface ICheckboxGroupP {
  /**
   * 选中的值
   */
  choose: string[] ,
  /**
   * 标签的name 值
   */
  name: string,
  /**
   * 数据集合
   */
  data: checkboxObj[]
  /**
   * change 事件
   */
  onChange: (v: any, name: string, e: React.ChangeEvent<HTMLInputElement>) => void,
}
export default class CheckboxGroup extends Component<ICheckboxGroupP> {
/**
 * 获取checkbox
 */
  getCheckbox = ():JSX.Element[] => {
    return this.props.data.map(p => {
      return (
       <label key={p.value}>
          <input 
          type='checkbox' 
          name={this.props.name}
          checked={this.props.choose.includes(p.value)}
          value={p.value}
          onChange={e => this.props.onChange(e.target.value,this.props.name,e )}
          />
          {p.label}
       </label>
      )
    })
  }
  render() {
    return (
      <div>
       {this.getCheckbox()} 
      </div>
    )
  }
}


使用方式


import React, { Component } from 'react'
import CheckboxGroup from '.'
/**
 * 按钮组
 */
interface ICheckboxGroupTestS {
  choose: string[],
  data: checkboxObj[]
}
/**
 * 每一个radio的对象类型
 */
type checkboxObj = {
  value: string,
  label: string | number
}
export default class CheckboxGroupTest extends Component<{}, ICheckboxGroupTestS> {
  state: ICheckboxGroupTestS = {
    choose: ['football'],
    data: [
      { value: 'football', label: '足球' },
      { value: 'basketball', label: '篮球' },
      { value: 'tennis', label: '网球' },
    ]
  }
  render() {
    return (
      <>
        <CheckboxGroup 
        name='test' 
        data={this.state.data}
         choose={this.state.choose} 
         onChange={(v: string, name: string, e:  React.ChangeEvent<HTMLInputElement>)=>{
           let arr = [...this.state.choose];
           if(e.target.checked){
            arr.push(v);
           }else{
            arr = arr.filter(f => f !== v);
           }
           this.setState(pre => ({
             choose: arr
           }))
        }}/>
      </>
    )
  }
}


源码地址:

https://github.com/cll123456/react-learn/tree/master/src/pro/form

最终效果


20210223164951293.gif

相关文章
|
3天前
|
移动开发 前端开发 JavaScript
React 表单与事件
10月更文挑战第10天
13 1
|
3天前
|
前端开发 JavaScript 数据安全/隐私保护
深入探索研究React表单
【10月更文挑战第6天】
81 57
|
11天前
|
移动开发 JSON 数据可视化
精选八款包括可视化CMS,jquery可视化表单,vue可视化拖拉,react可视化源码
精选八款包括可视化CMS,jquery可视化表单,vue可视化拖拉,react可视化源码
33 0
|
1月前
|
人工智能 前端开发 JavaScript
react js 处理表单( form )的2个例子
react js 处理表单( form )的2个例子
|
2月前
|
容器 Kubernetes Docker
云原生JSF:在Kubernetes的星辰大海中,让JSF应用乘风破浪!
【8月更文挑战第31天】在本指南中,您将学会如何在Kubernetes上部署JavaServer Faces (JSF)应用,享受容器化带来的灵活性与可扩展性。文章详细介绍了从构建Docker镜像到配置Kubernetes部署全流程,涵盖Dockerfile编写、Kubernetes资源配置及应用验证。通过这些步骤,您的JSF应用将充分利用Kubernetes的优势,实现自动化管理和高效运行,开启Java Web开发的新篇章。
48 0
|
2月前
|
前端开发 JavaScript API
掌握React表单管理的高级技巧:探索Hooks和Context API如何协同工作以简化状态管理与组件通信
【8月更文挑战第31天】在React中管理复杂的表单状态曾是一大挑战,传统上我们可能会依赖如Redux等状态管理库。然而,React Hooks和Context API的引入提供了一种更简洁高效的解决方案。本文将详细介绍如何利用Hooks和Context API来优化React应用中的表单状态管理,通过自定义Hook `useForm` 和 `FormContext` 实现状态的轻松共享与更新,使代码更清晰且易于维护,为开发者带来更高效的开发体验。
40 0
|
2月前
|
前端开发 JavaScript 数据管理
React Formik入门:简化表单处理的神器——全面掌握Formik在React表单开发中的高效应用与实战技巧
【8月更文挑战第31天】在React应用中,表单处理常常因繁琐而令人头疼。Formik作为一个开源库,专为简化React表单设计,减少冗余代码并提升处理效率。本文介绍Formik的使用方法及其优势,通过示例展示如何安装配置并创建基本表单,帮助开发者轻松应对各种表单需求。
35 0
|
3月前
|
JavaScript 前端开发
react18【系列实用教程】双向绑定表单 (2024最新版)含受控组件、非受控组件、单行多行输入框 input,下拉选择 select,单选 radio,多选 checkbox,标签 label
react18【系列实用教程】双向绑定表单 (2024最新版)含受控组件、非受控组件、单行多行输入框 input,下拉选择 select,单选 radio,多选 checkbox,标签 label
125 1
|
5月前
|
监控 前端开发 搜索推荐
react 表单受控的现代实现方案
`react-form-simple`是一个轻量级的React表单库,专注于简化受控表单的开发,提供数据绑定、验证、错误处理和UI更新等功能。它通过简洁的API减少复杂性,支持第三方UI库集成,并具备高度可扩展性。核心特点包括基于Proxy的数据绑定、实时错误处理、高效的UI更新和灵活的使用方式。通过`useForm`和`render`等钩子,开发者可以快速构建表单应用,同时支持动态表单和自定义验证规则。该库旨在提高开发效率,适用于复杂表单场景,降低学习和维护成本。
212 2
react 表单受控的现代实现方案
|
4月前
|
存储 前端开发 数据可视化
React 中重新实现强制实施表单
React 中重新实现强制实施表单