React中受控组件和非受控组件

news/2024/7/19 15:35:09 标签: react, js, html

一、受控组件

受控组件就是可以被 html" title=react>react 状态控制的组件
html" title=react>react 中,Input textarea 等组件默认是非受控组件(输入框内部的值是用户控制,和 React 无关)。但是也可以转化成受控组件,就是通过 onChange 事件获取当前输入内容,将当前输入内容作为 value 传入,此时就成为受控组件。
好处:可以通过 onChange 事件控制用户输入,使用正则表达式过滤不合理输入。

双向数据绑定就是受控组件:

受控组件DOM操作、双向数据绑定
import React,{Component} from 'html" title=react>react';
import ReactDOM from 'html" title=react>react-dom';

class Input extends Component{
    constructor(){
        super();
        this.state = {val:''};
    }
    handleChange=(event)=>{
        let val = event.target.value;
        this.setState({val})
    }

    render(){
        return (
            <div>
                <p>{this.state.val}</p>
                <input type="text" value={this.state.val} onChange={this.handleChange} /> //input就是受控组件 被状态对象的属性控制
            </div> 
        )
    }
}

ReactDOM.render(<Input/>,window.app)
import React,{Component} from 'html" title=react>react';
import ReactDOM from 'html" title=react>react-dom';

class Sum extends Component{
    constructor(){
        super();
        this.state={a:0,b:0,result:0}
    }
    handleChangeA=(event)=>{
        this.setState({
            a:parseInt(event.target.value),
            result:parseInt(event.target.value)+this.state.b
        })
    }
    handleChangeB=(event)=>{
        this.setState({
            b:parseInt(event.target.value),
            result:parseInt(event.target.value)+this.state.a
        })
    }
    render(){
        return (
            <div>
                <input type="text" value={this.state.a} onChange={this.handleChangeA}/> +
                <input type="text" value={this.state.b} onChange={this.handleChangeB} /> = 
                <input type="text" value={this.state.result}/>
            </div>
        )
    }
}

ReactDOM.render(<Sum/>,window.app)

二、非受控组件

表单数据由 DOM 本身处理。即不受 setState() 的控制,与传统的HTML表单输入相似,input 输入值即显示最新值(使用 refDOM 获取表单值)

class NameForm extends React.Component {
  constructor(props) {
    super(props);
    this.handleSubmit = this.handleSubmit.bind(this);
  }

  handleSubmit(event) {
    alert('A name was submitted: ' + this.input.value);
    event.preventDefault();
  }

  render() {
    return (
      <form onSubmit={this.handleSubmit}>
        <label>
          Name:
          <input type="text" ref={(input) => this.input = input} />
        </label>
        <input type="submit" value="Submit" />
      </form>
    );
  }
}

三、结论

受控和非受控元素都有其优点,根据具体情况选择。如果表单在 UI 反馈方面非常简单,则对 ref 进行控制是完全正确的,即使用非受控组件。

特征非受控制受控
一次性检索(例如表单提交)yesyes
及时验证noyes
有条件的禁用提交按钮noyes
执行输入格式noyes
一个数据的几个输入noyes
动态输入noyes

http://www.niftyadmin.cn/n/1527256.html

相关文章

React中高阶函数和函数的柯里化

一、高阶函数&#xff1a; 如果一个函数符合下面2个规范中的任何一个&#xff0c;那该函数就是高阶函数。 若A函数&#xff0c;接收的参数是一个函数&#xff0c;那么A就可以称之为高阶函数。若A函数&#xff0c;调用的返回值依然是一个函数&#xff0c;那么A就可以称之为高阶…

maven安装与配置到idea中

maven安装 在官网下载压缩包,网址: https://maven.apache.org/download.cgi?.解压到一个目录,目录最好不要有中文和空格配置环境变量: 新建一个变量: M2_HOME , 变量值为maven的路径(不带bin目录),在PATH变量中追加值: %M2_HOME%\bin 打开cmd输入 mvn -v出现以下内容安装成功…

Elementui中在表格中插入图片

效果&#xff1a; 插入单张选中放大&#xff1a; <el-table-column label"商品详情"><template slot-scope"scope"><el-popover placement"top-start" title"" trigger"hover"><img :src"scope…

React脚手架public文件介绍

public文件夹下index.js <!DOCTYPE html> <html lang"en"><head><meta charset"utf-8" /><!-- %PUBLIC_URL%代表public文件夹的路径 --><link rel"icon" href"%PUBLIC_URL%/favicon.ico" /><…

Elementui实现面包屑($route.matched)

this.$route.matched匹配到的会是一个数组&#xff0c;包含当前页面之前所有路由信息。然后我们可以直接利用路由信息渲染我们的面包屑导航。 //demo <template><div class"nav-wrap"><router-link v-for"(item, index) in navList" :key&…

Vue中$router和$route的常用api

一、$router router是VueRouter的一个对象&#xff0c;通过Vue.use(VueRouter)和VueRouter构造函数得到一个router的实例对象&#xff0c;这个对象中是一个全局的对象&#xff0c;他包含了所有的路由包含了许多关键的对象和属性。 $router.push // 字符串 this.$router.push…

Vue动态组件(:is)

概念&#xff1a; 让多个组件使用同一个挂载点&#xff0c;并动态切换&#xff0c;这就是动态组件。 通过使用保留的 <component> 元素&#xff0c;动态地绑定到它的 is 特性&#xff0c;可以实现动态组件 1、基础用法 <div id"example"><button c…

Vue中路由表单缓存(keep-alive)

vue 中从一个路由切换到另一个路由的时候&#xff0c;第一个路由可能有表单信息&#xff0c;但切换到第二个路由时&#xff0c;第一个路由里的组件会被销毁&#xff0c;表单里填写的 value 也会消失&#xff0c;keep-alive 就可以帮我们缓存我们不想被销毁的组件。 页面效果&a…