React学习之受控组件与数据共享实例分析


Posted in Javascript onJanuary 06, 2020

本文实例讲述了React学习之受控组件与数据共享。分享给大家供大家参考,具体如下:

在HTML当中,像<input>,<textarea>, 和 <select>这类表单元素会自己储存值,并且根据用户输入进行更新。但在React中,可变的值通常保存在组件的state中,并且只能用 setState() 方法进行更新。为了解决二者的矛盾,可以让HTML元素不再自己储存数据,而使用来自于react的state。也就是说HTML元素把数据保存在react组件的state中,并根据state值来渲染更新HTML的内容。这种值由React控制的表单元素称为受控组件。

1、input

例如将input输入的名字保存在state.name中,并且设置input显示的value值为state.name。当input中输入变化时,onChange触发updateName函数更新name值,从而使input中显示的value发生变化。当点击提交按钮时onClick触发submit()方法来阻止默认的提交,并打印提示信息:

class ControlledForm extends React.Component{
 constructor(props){
  super(props);
  this.state={
   name:''
  };
  this.updateName=this.updateName.bind(this);
  this.submit=this.submit.bind(this);
 }
 updateName(e){        //在调用函数时会默认传入时间参数e
  this.setState({
   name:e.target.value    //更新name的值为input中输入的值
  })
 }
 submit(e){          //自己定义点击submit后的操作
  console.log("姓名"+this.state.name+"提交成功");
  e.preventDefault();     //阻止表单默认提交行为
 }
 render(){
  return (
   <form onSubmit={this.submitForm}>
     <label>
       姓名:
       <input type="text" value={this.state.name} onChange={this.updateName} />
     </label>
     <input type="submit" value="提交" onClick={this.submit} />
   </form>
  )
 }
}

使用受控组件使得页面的数据都处于react的控制之下,而且可以对其数据进行处理之后再渲染到页面上。

2、textarea

在React中使用<textarea>:为了对textarea的输入内容进行控制,react中的textarea像input一样由value来控制其显示的值,并且通过e.target.value将textarea中的值存入state中。textarea的使用也由闭合式标签<textarea></textarea>变为开放式标签:

<textarea value={this.state.text} onChange={this.updateText} />

3、select

同理,在React中的<select>也通过value来控制哪个option的选中,并通过e.target.value将选中的option的值传给state。例如和this.state.sex值相同的option会被显示选中

<select value={this.state.sex} onChange={this.updateSex}>
  <option value="male">男</option>
  <option value="female">女</option>
</select>

4、利用name处理多个受控组件

如上,我们需要为每个受控组件都设置更新方法onChange,而且每个组件的更新方法都很类似,这样看起来很麻烦,我们可以根据name属性区分不同的组件所对应的state值,利用一个函数来实现多个组件state值的更新:

<select value={this.state.sex} name="sex" onChange={this.updateForm}>
updateForm(e){
 let name=e.target.name;     //获取组件的name
 let value=e.target.value;    //获取组件的值value
 this.setState({
  [name]:value         //为不同name的组件设置value
 })
}

在setState方法中,通过ES6的语法计算属性[],在中括号中指定要更新的属性名的表达式来更新不同的state。例如当select调用updateForm()时,name="sex",value="male",则通过setState将state.sex值设为male。

5、组件间数据共享

当两个组件要同时使用一个变量时,由于state只能被它所定义的组件修改、访问,因此不能把state赋给某个组件,而应该将state提升至两个组件最近的公共父组件,父组件再通过props将值传递给子组件,这样两个子组件就都可以访问了。那么子组件怎么去修改父组件的state呢?子组件通过props属性来调用父组件的方法从而修改父组件的state,这样两个组件就通过父组件实现了对state的共享。例如父组件Parent的一个子组件ChildInput负责接收用户的输入,保存在state.text中,在另一个子组件ChildShow中显示用户的输入:

class Parent extends React.Component{
 constructor(props){
  super(props);
  this.state={
   text:''
  };
  this.updateText=this.updateText.bind(this);
 }
 updateText(value){
  this.setState({
   text:value
  })
 }
 render(){
  return (
   <fieldset>
     <legend>提升state</legend>    //父组件updateInput属性指向updateText方法
     <ChildInput text={this.state.text} updateInput={this.updateText}/>
     <ChildShow text={this.state.text} />
   </fieldset>
  )
 }
}
class ChildInput extends React.Component{
 constructor(props){
  super(props);
  this.handleChange=this.handleChange.bind(this);
 }
 handleChange(e){    //在子组件的方法中调用父组件的updateInput更新text的值
  this.props.updateInput(e.target.value);
 }
 render(){
  return (
   <div>
     <label>
       请输入:
       <input type="text" value={this.props.text} onChange={this.handleChange}/>
     </label>
   </div>
  )
 }
}
class ChildShow extends React.Component{
 constructor(props){
  super(props);    //通过调用父组件构造方法将父组件的props传递给子组件
 }
 render(){
  return (
   <div>
     <p>输入为:{this.props.text}</p>
   </div>
  )
 }
}
ReactDOM.render(
 <Parent/>,
 document.getElementById('app')
)

运行结果如图:

React学习之受控组件与数据共享实例分析

上例在react中的数据流动如下:

1、当在input中中输入内容时,input内容改变onChange触发ChildInput组件的handleChange方法,该方法通过this.props调用父组件updateInput方法并传递输入的内容e.target.value。

2、父组件Parent在引用子组件ChildInput时为其定义updateInput属性为this.updateText方法,因此触发updateText方法,在该方法中接收子组件传递的参数value,并通过setState方法修改state.text的值。

3、当state.text值发生改变时,父组件Parent通过属性props将值传递给子组件ChildInput与ChildShow,引起子组件属性改变,从而子组件重新渲染页面内容。

希望本文所述对大家React程序设计有所帮助。

Javascript 相关文章推荐
Javascript无阻塞加载具体方式
Jun 28 Javascript
JavaScript按位运算符的应用简析
Feb 04 Javascript
首页图片漂浮效果示例代码
Jun 05 Javascript
使用jQuery实现input数值增量和减量的方法
Jan 24 Javascript
JavaScript获取指定元素位置的方法
Apr 08 Javascript
jQuery多个版本和其他js库冲突的解决方法
Aug 11 Javascript
原生JS+HTML5实现的可调节写字板功能示例
Aug 30 Javascript
Vue实现移动端页面切换效果【推荐】
Nov 13 Javascript
微信小程序实现传递多个参数与事件处理
Aug 12 Javascript
微信小程序获取用户信息及手机号(后端TP5.0)
Sep 12 Javascript
js计时事件实现圆形时钟
Mar 25 Javascript
js实现打字小游戏
Dec 17 Javascript
Node.js创建一个Express服务的方法详解
Jan 06 #Javascript
JS正则表达式验证端口范围(0-65535)
Jan 06 #Javascript
基于jQuery实现挂号平台首页源码
Jan 06 #jQuery
JS实现音乐导航特效
Jan 06 #Javascript
使用vue实现一个电子签名组件的示例代码
Jan 06 #Javascript
Vuejs中的watch实例详解(监听者)
Jan 05 #Javascript
Node中对非阻塞I/O、事件循环的知识点总结
Jan 05 #Javascript
You might like
Protoss魔法科技
2020/03/14 星际争霸
Array of country list in PHP with Zend Framework
2011/10/17 PHP
php的ZipArchive类用法实例
2014/10/20 PHP
php递归遍历删除文件的方法
2015/04/17 PHP
使用PHP+AJAX让WordPress动态加载文章的教程
2015/12/11 PHP
yii2 数据库读写分离配置示例
2017/02/10 PHP
PHP新特性详解之命名空间、性状与生成器
2017/07/18 PHP
Thinkphp5.0 框架视图view的比较标签用法分析
2019/10/12 PHP
Laravel框架中队列和工作(Queues、Jobs)操作实例详解
2020/04/06 PHP
Mootools 1.2教程 Tooltips
2009/09/15 Javascript
js面向对象设计用{}好还是function(){}好(构造函数)
2011/10/23 Javascript
详解BootStrap中Affix控件的使用及保持布局的美观的方法
2016/07/08 Javascript
AngularJS中如何使用echart插件示例详解
2016/10/26 Javascript
Ionic+AngularJS实现登录和注册带验证功能
2017/02/09 Javascript
浅谈JS中的常用选择器及属性、方法的调用
2017/07/28 Javascript
layui插件表单验证提交触发提交的例子
2019/09/09 Javascript
layui问题之自动滚动二级iframe页面到指定位置的方法
2019/09/18 Javascript
JS实现碰撞检测效果
2020/03/12 Javascript
详解Python3.1版本带来的核心变化
2015/04/07 Python
Python多层嵌套list的递归处理方法(推荐)
2016/06/08 Python
python魔法方法-属性转换和类的表示详解
2016/07/22 Python
Pipenv一键搭建python虚拟环境的方法
2018/05/22 Python
Python 给屏幕打印信息加上颜色的实现方法
2019/04/24 Python
通过Python实现一个简单的html页面
2020/05/16 Python
Python环境管理virtualenv&amp;virtualenvwrapper的配置详解
2020/07/01 Python
从零开始的TensorFlow+VScode开发环境搭建的步骤(图文)
2020/08/31 Python
python两种注释用法的示例
2020/10/09 Python
pymysql模块使用简介与示例
2020/11/17 Python
精油和天然健康美容产品:Art Naturals
2018/01/27 全球购物
领先的荷兰线上超市:荷兰之家Holland at Home(支持中文)
2021/01/21 全球购物
高中生校园生活自我评价
2013/09/19 职场文书
高三毕业典礼演讲稿
2014/05/13 职场文书
演讲稿的格式及范文
2014/08/22 职场文书
工会经费申请报告
2015/05/15 职场文书
2019个人工作态度自我评价
2019/04/24 职场文书
Spring中bean的生命周期之getSingleton方法
2021/06/30 Java/Android