react-表单

所有的表单元素默认为非受控组件

非受控组件: 组件的内容元素等只受该组件控制,使用者不可控制

将表单元素转换为受控组件

type为text,password,textarea,还有select选择器设置value属性即可转化为受控组件
radio与checkbox则需要设置checked属性

注意事项

  1. 当value属性设置为静态值时,也就意味着该值不可改变,需要设置readOnly属性
  2. 当value属性设置为变量,即与state绑定时,需要提供onChange事件,以改变value值,否则出警告

FormGroup.js

import React, { Component } from 'react'

export default class FormGroup extends Component {
  state = { // 设置初始属性
    loginId: '', // 登陆账号
    loginPwd: '', // 登陆密码
    sex: 'male', // 性别
    loves: [
      {
        value: 'football',
        label: '足球'
      },
      {
        value: 'basketball',
        label: '篮球'
      },
      {
        value: 'movie',
        label: '电影'
      },
      {
        value: 'music',
        label: '音乐'
      },
      {
        value: 'other',
        label: '其他'
      }
    ], // 爱好
    chooseLoves: [], // 已选择的爱好
    city: '' // 城市
  }
  /**
   * 处理表单元素改变
   * @param {Object} e 
   */
  handleChange = e => {
    let value = e.target.value
    const name = e.target.name
    if (e.target.type === 'checkbox') {
      if (e.target.checked) {
        value = [...this.state.chooseLoves, value]
      }else {
        value = this.state.chooseLoves.filter(it => it !== value)
      }
    }
    this.setState({
      [name]: value
    })
  }
  /**
   * 获取爱好列表
   * @returns Array
   */
  getLoves = () => {
    const bs = this.state.loves.map(it => {
      return (
        <label key={it.value}> {/* 循环需要绑定key */}
          <input name='chooseLoves' type="checkbox"
            checked={this.state.chooseLoves.includes(it.value)} 
            value={it.value} onChange={this.handleChange} />
          {it.label}
        </label>
      )
    })
    return bs
  }

  render() {
    const bs = this.getLoves() // 获取爱好列表
    return (
      <div>
        {/* 需要让表单元素的name属性与state状态用相同的名字 */}
        <p>
          <input name='loginId' type="text" value={this.state.loginId} onChange={this.handleChange} />
        </p>
        <p>
          <input name='loginPwd' type="password" value={this.state.loginPwd} onChange={this.handleChange} />
        </p>
        <p>
          <label>
            <input name='sex' type="radio" value='male' checked={this.state.sex === 'male'} onChange={this.handleChange} /></label>
          <label>
            <input name='sex' type="radio" value='female' checked={this.state.sex === 'female'} onChange={this.handleChange} /></label>
        </p>
        <p>
          {/* 列表元素特殊处理 */}
          {bs}
        </p>
        <p>
          <select name="city" value={this.state.city} onChange={this.handleChange} placeholder='请选择城市'>
            <option value="beijing">北京</option>
            <option value="shanghai">上海</option>
            <option value="shenzhen">深圳</option>
          </select>
        </p>
        <button onClick={()=> {
          console.log('状态', this.state)
        }}>获取状态</button>
      </div>
    )
  }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

合法的咸鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值