react 表单(受控组件和非受控组件)

我们知道表单元素与其他的普通DOM元素来说是不一样的,它们保存了自己的一些状态。

我们主要说的就是表单元素中的受控组件非受控组件

受控组件就是这个组件的状态是我们(react)控制的,这个组件的行为是完全受到我们控制的,所以叫做受控组件,比如:

 1 class NameForm extends React.Component {
 2   constructor(props) {
 3     super(props);
 4     this.state = {value: ‘‘};
 5
 6     this.handleChange = this.handleChange.bind(this);
 7     this.handleSubmit = this.handleSubmit.bind(this);
 8   }
 9
10   handleChange(event) {
11     this.setState({value: event.target.value});
12   }
13
14   handleSubmit(event) {
15     alert(‘A name was submitted: ‘ + this.state.value);
16     event.preventDefault();
17   }
18
19   render() {
20     return (
21       <form onSubmit={this.handleSubmit}>
22         <label>
23           Name:
24           <input type="text" value={this.state.value} onChange={this.handleChange} />
25         </label>
26         <input type="submit" value="Submit" />
27       </form>
28     );
29   }
30 }

这个表单中的inputvalue是受到组件的state来控制的,并且元素的onChange也是受到组件的控制函数控制的,并且最终表单的提交也是收到组件的提交处理函数控制的。也就是说,组件任何状态的改变,都是收到一个相关的处理函数控制的。那么我们想想这种受控组件有什么优点和缺点,我们稍微想一下就是受控组件的话,优点就是一切都是可以控制的,缺点很明显,就是写起来比较麻烦,不过这也不算是缺点吧,毕竟要功能强大,肯定就需要自己定制呀。

非受控组件

在大多数情况下,我们推荐使用 受控组件 来实现表单。 在受控组件中,表单数据由 React 组件处理。如果让表单数据由 DOM 处理时,替代方案为使用非受控组件。

这句话大概说明了什么是非受控组件。我们看一个例子:

 1 class NameForm extends React.Component {
 2   constructor(props) {
 3     super(props);
 4     this.handleSubmit = this.handleSubmit.bind(this);
 5   }
 6
 7   handleSubmit(event) {
 8     alert(‘A name was submitted: ‘ + this.input.value);
 9     event.preventDefault();
10   }
11
12   render() {
13     return (
14       <form onSubmit={this.handleSubmit}>
15         <label>
16           Name:
17           <input type="text" ref={(input) => this.input = input} />
18         </label>
19         <input type="submit" value="Submit" />
20       </form>
21     );
22   }
23 }

我们可以跟上面的受控组件做一个下比较,首先直观上看,我们的代码量少了一点,那么具体哪里少了呢,就是我们不需要对inputonChange事件进行函数处理,我们也没有保存inputvaluestate,所以这个组件的状态是由它自己保存的,我们可以在需要的时候通过ref获取到,比如在submit的时候。有时候我们需要给组件加上默认值,受控组件很容易做到,就是给state初始化的时候给一个默认值,但是非受控组件怎么弄呢?这里有一个属性叫做defaultValue我们给input传入这个属性就可以修改它的初始值了。(checkbox 和 radio 是defaultChecked

那么我们到底该如何选择使用受控组件还是非受控组件呢?
我也不是特别明确,看了一些别人写的文章,我的理解是:当我们需要实时的控制组件的状态(包括样式,值等),我们就应该使用受控组件,如果我们只是需要在提交的时候获取一下值什么的,我们可以选择使用非受控组件。

还有一个特殊的东西,就是<input type=‘file‘>,这种组件只能是非受控组件,因为它的value属性是只读的,只能够受用户控制,我们没法主动去控制。

原文地址:https://www.cnblogs.com/GGbondLearn/p/12179298.html

时间: 2024-07-30 06:45:19

react 表单(受控组件和非受控组件)的相关文章

浅谈react受控组件与非受控组件

最近在使用蚂蚁金服出品的一条基于react的ant-design UI组件时遇到一个问题,编辑页面时input输入框会展示保存前的数据,但是是用defaultValue就是不起作用,输入框始终为空值而不是具体的传入的值.具体编辑页面中文本框相关的代码如下:         ... //render方法上面的内容省略  <FormItem       label="问题描述:"       hasFeedback      {...props.formItemLayout}  &g

Vue父子组件及非父子组件如何通信

1.父组件传递数据给子组件 父组件数据如何传递给子组件呢?可以通过props属性来实现 父组件: 子组件通过props来接收数据: 方式1: 方式2 : 方式3: 这样呢,就实现了父组件向子组件传递数据. 2.子组件与父组件通信 那么,如果子组件想要改变数据呢?这在vue中是不允许的,因为vue只允许单向数据传递,这时候我们可以通过触发事件来通知父组件改变数据,从而达到改变子组件数据的目的. 父组件: 3.非父子组件通信 如果2个组件不是父子组件那么如何通信呢?这时可以通过eventHub来实现

React 受控组件和非受控组件

需求用户名自动获取 onChange用户状态发生改变 就获取值 就是时时获取值 使用onChange 点击按钮 获取密码 只要绑定了点击事件 就可以获取值 通过 let usercont=event.target.value;//获取用户的值 ref获取值的另外一种用法 密码: <input type="password" ref={this.Myrefs}></input> Myrefs = React.createRef();//创建一个承装ref的容器 M

React表单元素的使用

一. 1 <!DOCTYPE html> 2 <html lang="zh-cn"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>表单详解</title> 6 </head> 7 <body> 8 <script src="./react-0.13.2/react-0.13.2/build/react-with-a

使用Formik轻松开发更高质量的React表单(一)入门

前言 发现Formik是在我学习redux-form过程中从国外一篇博客上偶然发现的,看到作者的高度肯定后我立即转到github上,正如许多朋友所注意的,我发现其星数达8282,这个数字在github虽然不算很高,但是在探讨基于React技术开发跨平台表单这个主题的开源库角度来看,这个数字已经相当不错了.不自觉地,我对比了redux-form与Formik的几个数据,如下: 库 开源库的时间 星数 redux-form 3年以前 10210 Formik 1年前 8282 几个不太肯定的结论(欢

react表单

和html一样, react也提供了许多的可供交互的组件, 这些组件有 input, textarea, option等. react 提供的这些组件与其他的组件又有一些不同, 其他的组件多数用于展示信息, 而这些组件可以通过用户的操作进行交互. 那么input, checked, selected 主要是在哪些地方可以使用呢? 1. value, 支持<input> 和 <textarea>两种组件. 2. checked 支持<input> 类型为checkbox和

react函数式组件(非路由组件)实现路由跳转

个人理解: <Route exact path="/Home" component={Home}/> 1.路由组件:只有包裹在Route组件里的才能使用`this.props.location`, 2.非路由组件:假如有个需求,是面包屑或者导航组件里需要拿到`this.props.location`(导航组件或者面包屑一般不会包裹在`Route`里吧),那么直接这么写显然就不行了. 这个时候`withRouter`修饰一下,就可以这么写了. useHistory impor

vue2.0父子组件以及非父子组件如何通信

1.父组件 >>> 子组件 父组件数据如何传递给子组件呢?可以通过props属性来实现 父组件: <parent> <child :child-msg="msg"></child> //这里必须要用 - 代替驼峰 </parent> data(){ return { msg: [1,2,3] }; } 子组件通过props来接收数据: 方式1: props: ['childMsg'] 方式2 : props: { chi

Vue父子组件和非父子组件传值问题

父组件跟子组件之间的传值(具体参考lonzhubb商城) 1.父组件传值给子组件形式,ifshop是要传的对象,右边ifshop代表要传的这个对象的数据 <v-select  :ifshop="ifshop"  :clickType="clickType" @close="close" @addShop="sureAddShop"></v-select> 2.子组件接收父组件的数据用props prop