react 之受控组件与非受控组件

react 之受控组件与非受控组件

  • 所谓受控组件:就是input、textarea、select的值的改变通常是根据用户输入进行更新,采用的是 对表单进行控制的实现<input value={受控值} onChange={受控的方法} /> 受控值需要定义在state之中,然后的话在受控的方法之中拿到当前受控值,修改state之中的受控值!
  • 所谓非受控组件,就是使用ref节点的形式去拿到当前节点的value值,然后赋值给给一个节点:比如this.iptName,而iptName代表的是当前input节点,<input type="text" ref={(iptName) => (this.iptName = iptName)} />,在使用的时候,需要拿到当前节点的值的时候:this.iptName.value,然后的话,使用额外操作的方法,去修改state的值

受控组件

在这里插入图片描述

import React, { Component } from "react";

export default class app extends Component {
  state = {
    count2: 0,
    optionValue: 1,
    iptName2: "",
  };
  // 受控组件
  selectChange = (event) => {
    const optionValue = event.target.value * 1;
    this.setState({
      optionValue,
    });
  };
  add2 = () => {
    const { count2, optionValue } = this.state;
    this.setState({
      count2: count2 + optionValue,
    });
  };
  sub2 = () => {
    const { count2, optionValue } = this.state;
    this.setState({
      count2: count2 - optionValue,
    });
  };
  iptName2Change = (event) => {
    const iptName2 = event.target.value;
    // console.log('使劲',iptName2);
    this.setState({
      iptName2,
    });
  };
  submit2 = () => {
    const { iptName2 } = this.state;
    console.log("提交的时候", iptName2);
  };
  render() {
    const { count2, optionValue, iptName2 } = this.state;
    return (
      <div>
        <div>
          <div>受控组件</div>
          <div>add的数目: {count2}</div>
          <div>
            <select value={optionValue} onChange={this.selectChange}>
              <option value="1">1</option>
              <option value="2">2</option>
              <option value="3">3</option>
            </select>
            &nbsp;
            <button onClick={this.add2}>+</button>&nbsp;
            <button onClick={this.sub2}>-</button>&nbsp;
          </div>
          <div>input2输入的值:{iptName2}</div>
          <input type="text" value={iptName2} onChange={this.iptName2Change} />
          <button onClick={this.submit2}>提交</button>
        </div>
      </div>
    );
  }
}

非受控组件

在这里插入图片描述

import React, { Component } from "react";

// import { Button, Toast } from "antd-mobile";

export default class app extends Component {
  state = {
    count: 0,
    iptName: "",
  };
  // 非受控组件
  add = () => {
    // 拿到select的值
    const num = this.select.value * 1;
    const { count } = this.state;
    this.setState({
      count: count + num,
    });
  };
  sub = () => {
    const num = this.select.value * 1;
    const { count } = this.state;
    this.setState({
      count: count - num,
    });
  };
  evenAdd = () => {
    const num = this.select.value * 1;
    const { count } = this.state;
    if (num % 2 === 0) {
      this.setState({
        count: count + num,
      });
    }
  };
  asyncAdd = () => {
    const num = this.select.value * 1;
    const { count } = this.state;
    setTimeout(() => {
      this.setState({
        count: count + num,
      });
    }, 2000);
  };
  onBlur = () => {
    console.log("inpName失去焦点", this.iptName.value);
  };
  submit = () => {
    console.log("输入的值", this.iptName.value);
    // 点击提交的时候 拿到input表单的值
    const iptName = this.iptName.value;
    this.setState({
      iptName,
    });
    // 并且清空 input的值
    // this.iptName.value = ""
  };
  render() {
    const { count, iptName } = this.state;
    return (
      <div>
        <div>
          <div>非受控组件</div>
          <div>add数: {count}</div>
          <div>
            <select ref={(select) => (this.select = select)}>
              <option value="1">1</option>
              <option value="2">2</option>
              <option value="3">3</option>
            </select>
            &nbsp;
            <button onClick={this.add}>+</button>&nbsp;
            <button onClick={this.sub}>-</button>&nbsp;
            <button onClick={this.evenAdd}>偶数加</button>&nbsp;
            <button onClick={this.asyncAdd}>异步add</button>
          </div>
          <div>input输入的值:{iptName}</div>
          <input
            type="text"
            ref={(iptName) => (this.iptName = iptName)}
            onBlur={this.onBlur}
          />
          <button onClick={this.submit}>提交</button>
        </div>
      </div>
    );
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值