学习React中ref的两个demo示例


Posted in Javascript onAugust 14, 2018

为了摆脱繁琐的Dom操作, React提倡组件化, 组件内部用数据来驱动视图的方式,来实现各种复杂的业务逻辑 ,然而,当我们为原始Dom绑定事件的时候, 还需要通过组件获取原始的Dom, 而React也提供了ref为我们解决这个问题.

为什么不能从组件直接获取Dom?

组件并不是真实的 DOM 节点,而是存在于内存之中的一种数据结构,叫做虚拟 DOM (virtual DOM)。只有当它插入文档以后,才会变成真实的 DOM

如果需要从组件获取真实 DOM 的节点,就要用到官方提供的ref属性

使用场景

当用户加载页面后, 默认聚焦到input框

import React, { Component } from 'react';
import './App.css';

// React组件准确捕捉键盘事件的demo

class App extends Component {
 constructor(props) {
  super(props)
  this.state = {
   showTxt: ""
  }

  this.inputRef = React.createRef();
 }

 // 为input绑定事件
 componentDidMount(){
  this.inputRef.current.addEventListener("keydown", (event)=>{
   this.setState({showTxt: event.key})
  })

  // 默认聚焦input输入框
  this.inputRef.current.focus()
 }

 render() {
  return (
   <div className="app">
    <input ref={this.inputRef}/>
    <p>当前输入的是: <span>{this.state.showTxt}</span></p>
   </div>
  );
 }
}

export default App;

自动聚焦input动画演示

学习React中ref的两个demo示例

使用场景

为了更好的展示用户输入的银行卡号, 需要每隔四个数字加一个空格

实现思路:

当用户输入的字符个数, 可以被5整除时, 额外加一个空格

当用户删除数字时,遇到空格, 要移除两个字符(一个空格, 一个数字),

为了实现以上想法, 必须获取键盘的BackSpace事件, 重写删除的逻辑

限制为数字, 隔四位加空格

学习React中ref的两个demo示例 

import React, { Component } from 'react';
import './App.css';

// React组件准确捕捉键盘事件的demo
class App extends Component {
 constructor(props) {
  super(props)
  this.state = {
   showTxt: ""
  }

  this.inputRef = React.createRef();
  this.changeShowTxt = this.changeShowTxt.bind(this);
 }

 // 为input绑定事件
 componentDidMount(){
  this.inputRef.current.addEventListener("keydown", (event)=>{
   this.changeShowTxt(event);
  });
  // 默认聚焦input输入框
  this.inputRef.current.focus()
 }

 // 处理键盘事件
 changeShowTxt(event){
  // 当输入删除键时
  if (event.key === "Backspace") {
   // 如果以空格结尾, 删除两个字符
   if (this.state.showTxt.endsWith(" ")){
    this.setState({showTxt: this.state.showTxt.substring(0, this.state.showTxt.length-2)})
   // 正常删除一个字符
   }else{
    this.setState({showTxt: this.state.showTxt.substring(0, this.state.showTxt.length-1)})
   }

  }
  // 当输入数字时
  if (["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"].includes(event.key)){
   // 如果当前输入的字符个数取余为0, 则先添加一个空格
   if((this.state.showTxt.length+1)%5 === 0){
    this.setState({showTxt: this.state.showTxt+' '})
   }
   this.setState({showTxt: this.state.showTxt+event.key})
  }
 }

 render() {
  return (
   <div className="app">
    <p>银行卡号 隔四位加空格 demo</p>
    <input ref={this.inputRef} value={this.state.showTxt}/>
   </div>
  );
 }
}

export default App;

小结:

虚拟Dom虽然能够提升网页的性能, 但虚拟 DOM 是拿不到用户输入的。为了获取文本输入框的一些操作, 还是js原生的事件绑定机制最好用~

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js将json格式内容转换成对象的方法
Nov 01 Javascript
用jquery写的一个万年历(自写)
Jan 20 Javascript
JavaScript中使用document.write向页面输出内容实例
Oct 16 Javascript
基于jquery实现的仿优酷图片轮播特效代码
Jan 13 Javascript
jquery  实现轮播图详解及实例代码
Oct 12 Javascript
js实现二级导航功能
Mar 03 Javascript
详解Node.js access_token的获取、存储及更新
Jun 20 Javascript
angular.js + require.js构建模块化单页面应用的方法步骤
Jul 19 Javascript
JS实现按钮添加背景音乐示例代码
Oct 17 Javascript
JS实现从对象获取对象中单个键值的方法示例
Jun 05 Javascript
使用vue-router在Vue页面之间传递数据的方法
Jul 15 Javascript
JavaScript 继承 封装 多态实现及原理详解
Jul 29 Javascript
React 无状态组件(Stateless Component) 与高阶组件
Aug 14 #Javascript
浅析Vue实例以及生命周期
Aug 14 #Javascript
快速解决angularJS中用post方法时后台拿不到值的问题
Aug 14 #Javascript
详解angular应用容器化部署
Aug 14 #Javascript
使用node.js实现微信小程序实时聊天功能
Aug 13 #Javascript
JQuery通过后台获取数据遍历到前台的方法
Aug 13 #jQuery
AngularJS实现与后台服务器进行交互的示例讲解
Aug 13 #Javascript
You might like
需要注意的几个PHP漏洞小结
2012/02/05 PHP
教你如何快捷的使用cmd访问mysql小技巧
2014/05/26 PHP
destoon安全设置中需要设置可写权限的目录及文件
2014/06/21 PHP
php页面函数设置超时限制的方法
2014/12/01 PHP
实例讲解PHP页面静态化
2018/02/05 PHP
Laravel登录失败次数限制的实现方法
2020/08/26 PHP
javascript 获取select下拉列表值的代码
2009/09/07 Javascript
JS子父窗口互相操作取值赋值的方法介绍
2013/05/11 Javascript
Javascript闭包用法实例分析
2015/01/23 Javascript
JS生成某个范围的随机数【四种情况详解】
2016/04/20 Javascript
详解nodejs 文本操作模块-fs模块(四)
2016/12/22 NodeJs
Angular2 PrimeNG分页模块学习
2017/01/14 Javascript
Ajax异步文件上传与NodeJS express服务端处理
2017/04/01 NodeJs
JS仿淘宝搜索框用户输入事件的实现
2017/06/19 Javascript
详解vue 模版组件的三种用法
2017/07/21 Javascript
微信小程序之前台循环数据绑定
2017/08/18 Javascript
快速搭建React的环境步骤详解
2017/11/06 Javascript
Vue+ElementUI实现表单动态渲染、可视化配置的方法
2018/03/07 Javascript
JavaScript中this关键字用法实例分析
2018/08/24 Javascript
vue-video-player 通过自定义按钮组件实现全屏切换效果【推荐】
2018/08/29 Javascript
微信小程序对图片进行canvas压缩的方法示例详解
2020/11/12 Javascript
[52:00]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 LGD vs Optic
2018/04/02 DOTA
Python中使用PyQt把网页转换成PDF操作代码实例
2015/04/23 Python
Python自动化测试Eclipse+Pydev 搭建开发环境
2016/08/15 Python
Python机器学习之SVM支持向量机
2017/12/27 Python
关于Tensorflow中的tf.train.batch函数的使用
2018/04/24 Python
MANGO官方网站:西班牙芒果服装品牌
2017/01/15 全球购物
JOSEPH官网:英国奢侈时尚品牌
2018/01/31 全球购物
行政总监岗位职责
2013/12/05 职场文书
2014年党员公开承诺践诺书
2014/03/25 职场文书
超市仓管员岗位职责范本
2014/09/18 职场文书
授权委托书样本
2014/09/25 职场文书
第二次离婚起诉书
2015/05/18 职场文书
七年级作文之冬景
2019/11/07 职场文书
html form表单基础入门案例讲解
2021/07/21 HTML / CSS
mysql函数之截取字符串的实现
2022/08/14 MySQL