react中的 受控元素

受控元素在React中是指其视图状态完全由数据控制的元素。当用户尝试更改受控元素,如输入框的值,实际内容的更新需通过数据绑定。通过设置表单的`value`属性并监听`onChange`事件,可以实现受控元素的双向数据绑定。在处理多个受控元素时,可以使用`name`属性结合事件处理函数根据`event.target.name`来区分不同的元素。
摘要由CSDN通过智能技术生成

什么叫受控元素?

就是说页面到底渲染成什么样完全由数据说了算,数据去控制它,那这种元素就被称为受控元素

受控元素指的是什么呢?

  • 我们在元素 view 层有时会做一些事情,用户会在 view 层做操作,他操作完有可能会去改变原本视图层的内容
  • 比如我们在输入框有一个字符串,这个字符串就是一个数据,当我们去改变了这个值,那它能不能改?如果不能改,说明数据写死的是这个字符串,你在这里改是改不掉的,那么这个输入框就会变成一个受控元素
  • 就是我们本来有能力改掉的东西,但是你发现你改不了,那么这就是一个受控元素

受控元素

表单的value受控,受数据控制

<input type="text" value={this.state.content} />
  • 就像这样我们给它一个默认值,如果我们再点击输入框的时候机会发现无法修改
  • 并且会有一个提示:
    • 你看到的 value值实际上是一个受控元素,如果你想为非受控元素,你应该用 defaultValue来代替 里面的 vlaue
      在这里插入图片描述

怎么样把model 的数据拿去控制表单 的 value 值?

  • this.state.数据名 把你的数据绑过去
  • 这个时候 model层的数据送到 我们的view层,那么我的view层就受这条数据的控制

受控元素双向数据绑定

view 层反向修改 model 层数据(通过 onChange )
在这里插入图片描述

import React from 'react';
import ReactDom from 'react-dom'


class App extends React.Component {

  state={
    title:'受控元素',
    ipt:'输入的值'
  };

  checkIpt = (ev) => {    //默认传递事件对象 ev ,拿到这个事件对象就可以拿到事件目标(事件对象是一个虚拟 dom)
    this.setState({ipt:ev.target.value})
  };

  render(){

    let {title,ipt} = this.state;

    return (
      <div>

        <input type="text" value={ipt} onChange={this.checkIpt} />

      </div>
    )
  }
}

ReactDom.render(
  <App />,
  document.getElementById('root')
);

处理多个输入元素

  • 在上述代码中,我们每修改一个输入框里面的内容就需要调用一个函数,那么我们的函数就会越写越多,并且内容基本上相同
  • 这时我们就可以通过 name 来实现多个元素只调用一个函数来实现数据的双向绑定(实际上仍然是单向的)
  • 可以为每个元素添加一个 name 属性(通常和数据名一致),处理函数根据 event.target.name 的值来选择要做什么
<input name="inputUserName" 
<input name="inputContent"

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

代码展示:

import React from 'react';
import ReactDom from 'react-dom'

//处理多个输入元素

class App extends React.Component {

  state={
    title:'注册',
    username:'',
    password:'',
  };

  //处理多个输入元素
  checkIpt = (ev) => {
    this.setState({
      [ev.target.name]:ev.target.value   //这里我们通过 ev.target.name 来获取事件目标头上的 name
      									 // 通过 ev.target.value 再来获取到对应的值
    })
  };


  render(){

    let {title,username,password} = this.state;

    return (
      <div>

        <h3>{title}</h3>

        <input type="text" name="username" value={username} onChange={this.checkIpt}/>
        <input type="text" name="password" value={password} onChange={this.checkIpt}/>

      </div>
    )
  }
}

ReactDom.render(
  <App />,
  document.getElementById('root')
);

结果展示:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值