第十一单元(受控组件和非受控组件-实现类似于vue双向绑定的功能)

#课程目标

  1. 理解因为react的单向数据流
  2. 理解表单组件会因为react数据流变的不好维护
  3. 理解受控组件与非受控组件的实质区别
  4. 理解受控组件在实际项目中的运用场景
  5. 利用受控组件完成一个表单控件的封装

#知识点

  1. react单向数据流
  • 数据主要从父节点传递到子节点(通过props)如果顶层(父级)的某个props改变了,React会重渲染所有的子节点。
  • props => 不可以使用this.props直接修改props,因为props是只读的,props是用于整个组件树中传递数据和配置。
  • state => 每个组件都有属于自己的state,state和props的区别在于前者(state)只存在于组件内部,只能从当前组件调用this.setState修改state值(不可以直接修改this.state!)。
  1. 表单元素
  • 表单元素有其特殊之处,用户可以通过键盘输入与鼠标选择,改变界面的显示。界面的改变也意味着有一些数据被改动,比较明显的是input的value,textarea的innerHTML,radio/checkbox的checked。
  1. 非受控组件

    3-1. 如果一个表单组件没有value props(单选按钮和复选按钮对应的是 checked props)时,就可以称为非受控组件;

    3-2.使用defaultValue和defaultChecked来表示组件的默认状态;

    3-3.通过 defaultValue和defaultChecked来设置组件的默认值,它仅会被渲染一次,在后续的渲染时并不起作用

import React, { Component } from 'react';

class UnControlledInput extends Component {
handleSubmit = (e) => {
console.log(e);
e.preventDefault();
console.log(this.name.value);
}
render() {
return (
<form onSubmit={this.handleSubmit}>
<input type="text" ref={i => this.name = i} defaultValue="BeiJing" />
<button type="submit">Submit</button>
</form>
);
}
} export default UnControlledInput;
 
  1. 受控组件
  • 从React的思路来讲,肯定是想让数据控制一切,或者简单的理解为,页面的生成与更新得忠实地执行JSX的指令,如果说:
<input value={this.state.value} />
1
  • 当input.value是由组件的state.value拍出来的,当用户进行输入修改后,然后JSX再次重刷视图,这时input.value是采取用户的新值还是state的新值?基于这个分歧,React给出一个折衷的方案,两者都支持,于是就产生了今天的受控组件了。
  • React认为value/checked不能单独存在,需要与onInput/onChange/disabed/readOnly等控制value/checked的属性或事件一起使用。 它们共同构成受控组件,受控是受JSX的控制。如果用户没有写这些额外的属性与事件,那么框架内部会给它添加一些事件,如onClick, onInput, onChange,阻止你进行输入或选择,让你无法修改它的值。
  /*
受控组件
1. React是一个单向数据流
2. 但可以自定义双向数据流组件(受控组件)
*/
/*
功能: 自定义组件, 功能如下
1. 界面如页面所示
2. 初始数据显示为renyl
3. 输入数据时, 下面的数据同步变化
*/
class ControlInput extends React.Component{
constructor(props){
super(props);
this.state = {
msg:'renyl'
}
this.handleChange = this.handleChange.bind(this);
}
// 通过事件的形式控制存储状态
handleChange(event){
debugger;
console.log(event.target.value);
this.setState({
msg:event.target.value
});
}
render () {
let {msg} = this.state;
return (
<div>
<input onChange={this.handleChange} type="text" value={msg}/>
<p>{msg}</p>
</div>
)
}
}
ReactDOM.render(<ControlInput />,document.getElementById("example"));
 
  1. 受控组件的总结

    5-1.可以通过初始state中设置表单的默认值;

    5-2.每当表单的值发生变化时,调用onChange事件处理器;

    5-3.事件处理器通过合成事件对象e拿到改变后的状态,并更新应用的state.

    5-4.setState触发视图的重新渲染,完成表单组件值得更新

#授课思路

#案例和作业

  1. 高度还原页面
  2. 利用受控组件实现整体业务

react第十一单元(受控组件和非受控组件-实现类似于vue双向绑定的功能)的更多相关文章

  1. React:受控组件与非受控组件混用实战 - 译文

    原文链接:React: hybrid controlled components in action 受控组件 非受控组件 混用受控组件和非受控组件 原则一 原则二 原则三 原则四 实施方案 总结 F ...

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

    引言 最近在使用蚂蚁金服出品的一条基于react的ant-design UI组件时遇到一个问题,编辑页面时input输入框会展示保存前的数据,但是是用defaultValue就是不起作用,输入框始终为 ...

  3. React受控组件和非受控组件

    受控组件和非受控组件主要是用来解决表单组件状态谁来控制的问题.因为用户的输入会反应在界面上,相当于视图的状态发生了变化,而react是通过虚拟DOM比对修改视图的,这里就要决定谁来控制表单组件的状态. ...

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

    我们知道表单元素与其他的普通DOM元素来说是不一样的,它们保存了自己的一些状态. 我们主要说的就是表单元素中的受控组件和非受控组件. 受控组件就是这个组件的状态是我们(react)控制的,这个组件的行 ...

  5. react中 受控组件和 非受控组件 浅析

    一 受控组件 顾名思义,受控 也就是能够被控制,简而言之也就是 该组件ui的显示或者内部state逻辑的变化依赖外部的 props的传入. 二 非受控组件 顾名思义,非受控,也就是内部的视图变化,st ...

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

    1.父组件传递数据给子组件 父组件数据如何传递给子组件呢?可以通过props属性来实现 父组件: 子组件通过props来接收数据: 方式1: 方式2 : 方式3: 这样呢,就实现了父组件向子组件传递数 ...

  7. 学习React系列(四)——受控组件与非受控组件

    受控组件:通过组件的状态与属性的改变来控制组件 不可控组件:直接通过底层的dom来控制组件(具体来说就是通过绑定再底层dom上的方法来实现的,比如说ref,onChange) 受控组件 functio ...

  8. React 受控组件和非受控组件

    需求用户名自动获取 onChange用户状态发生改变 就获取值 就是时时获取值 使用onChange 点击按钮 获取密码 只要绑定了点击事件 就可以获取值 通过 let usercont=event. ...

  9. React组件之间通过Props传值的技巧(小案例,帮助体会理解props、state、受控组件和非受控组件等)

    本文重要是根据react小书上的一个很简单的例子改编的,加上自己的学习理解,希望可以通过实际案例让大家对概念有更清晰的理解,当然也希望能一块学习. import React,{Component} f ...

随机推荐

  1. 云计算之路-出海记:建一个免费仓库 Amazon RDS for SQL Server

    上周由于园子后院起火,不得不调兵回去救火,出海记暂时停更,这周继续更新,"出海记"记录的是我们在 AWS 上建设博客园海外站的历程. 在这一记中记录的是我们基于 AWS 免费套餐( ...

  2. Java基础知识面试题(最详细版)

    刚刚经历过秋招,看了大量的面经,顺便将常见的Java常考知识点总结了一下,并根据被问到的频率大致做了一个标注.一颗星表示知识点需要了解,被问到的频率不高,面试时起码能说个差不多.两颗星表示被问到的频率 ...

  3. appium服务器参数

    appium服务器初始化参数 Appium服务器初始化参数(功能) 设置能力 能力参数项 获取appPackage与appActivity 查看当前活动名称 使用uiautomatorviewer定位 ...

  4. day98:MoFang:服务端项目搭建

    目录 1.准备工作 2.创建项目启动文件manage.py 3.构建全局初始化函数并在函数内创建app应用对象 4.通过终端脚本启动项目 5.项目加载配置 6.数据库初始化 1.SQLAlchemy初 ...

  5. 专业五线谱作曲打谱软件Overture的常用快捷键功能大全

    快捷命令在我们使用软件时起到的帮助是不言而喻的,它用一个或几个简单的字母来代替常用的命令,使我们不用去记忆众多的长长的命令,也不必为了执行一个命令,在菜单和工具栏上寻寻觅觅.当然,随着Overture ...

  6. Snap Build Your Own Blocks输入中文解决办法

    Snap Build Your Own Blocks输入中文解决办法 Snap! (formerly BYOB) is a visual, drag-and-drop programming lang ...

  7. 使用OwnCloud建立属于自己私有的云存储网盘

    1.需要LAMP架构 实验环境:centos7.4 64位系统[root@xuegod63 ~]# yum install -y httpd php php-mysql mariadb-server ...

  8. TeXstudio 2020显示行号(与之前的版本位置不太一样)

  9. od中低位地址和高位的顺序,以及数据的存放读写

    在观察内存的时候应当注意"内存数据"与"数值数据"的区别. 在我们的调试环境中,内存由低到高分布,你可以简单地把这种情形理解成Win32系统在内存中由地位向高位 ...

  10. Error:Execution failed for task ':app:mergeDebugResources'. > Error: Some file crunching failed, see logs for details

    android studio中的资源文件命名是不能带有数字的,因为会与R类的资源ID起冲突,所以编译就发生了错误.