React表单处理中的受控组件和非受控组件

React表单处理中的受控组件和非受控组件

1.受控组件

1.HTML中的表单元素是可输入的,也就是有自己的可变状态;

2.React中可变状态通常保存在state中,并且只能通过setState()方法来修改;

3.React将state与表单元素值value绑定到一起,由state的值来控制表单元素的值;

4.受控组件:其值受到React控制的表单元素;

5.受控组件有文本框,富文本框,下拉框操作value属性,复选框操作checked属性;

//1.在state中添加一个状态,作为表单元素的value值(控制表单元素值的来源)
//2.给表单元素绑定change事件,将表单元素的值设置为state的值(控制表单元素值的变化)
state={txt:''}

<input type="text" value={this.state.txt}
onChange={e => this.setState({ txt: e.target.value })}
/>

demo

/* 
  受控组件示例
*/

class App extends React.Component {
  state = {
    txt: '',
    content: '',
    city: 'bj',
    isChecked: false
  }

  handleForm = e => {
    // 获取当前DOM对象
    const target = e.target

    // 根据类型获取值
    const value = target.type === 'checkbox'
      ? target.checked
      : target.value

    // 获取name
    const name = target.name

    this.setState({
      [name]: value
    })
  }

  render() {
    return (
      <div>
        {/* 文本框 */}
        <input type="text" name="txt" value={this.state.txt} onChange={this.handleForm} />
        <br/>

        {/* 富文本框 */}
        <textarea name="content" value={this.state.content} onChange={this.handleForm}></textarea>
        <br/>

        {/* 下拉框 */}
        <select name="city" value={this.state.city} onChange={this.handleForm}>
          <option value="sh">上海</option>
          <option value="bj">北京</option>
          <option value="gz">广州</option>
        </select>
        <br/>

        {/* 复选框 */}
        <input type="checkbox" name="isChecked" checked={this.state.isChecked} onChange={this.handleForm} />
      </div>
    )
  }
}

2.非受控组件

1.借助于ref,使用原生DOM方式来获取表单元素值

2.ref的作用:获取DOM或组件


class App extends React.Component {
    constructor () {
        super()
        //调用React.createRef()方法创建一个ref对象
        this.txtRef = React.createRef()
    }
    // 事件处理函数
    getTxt = () => {
        //通过ref对象以获取到文本框中的值
        console.log('文本框的值为:',this.txtRef.current.value)
    }

    render() {
        return (
            <div>
            	//通过创建好的ref对象添加到文本框中
                <input type="text" ref={this.txtRef}/>
                <button onClick={this.getTxt}>获取文本框的值</button>
            </div>
        )
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值