学习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 相关文章推荐
javascript小数计算出现近似值的解决办法
Feb 06 Javascript
JavaScript对象链式操作代码(jquery)
Jul 04 Javascript
Jquery如何实现点击时高亮显示代码
Jan 22 Javascript
JQuery实现鼠标移动图片显示描述层的方法
Jun 25 Javascript
angularjs学习笔记之完整的项目结构
Sep 26 Javascript
jQuery获取同级元素的简单代码
Jul 09 Javascript
Vue.js 和 MVVM 的注意事项
Nov 07 Javascript
详解能在多种前端框架下使用的表格控件
Jan 11 Javascript
老生常谈jacascript DOM节点获取
Apr 17 Javascript
JavaScript实现开关等效果
Sep 08 Javascript
vue实现公共方法抽离
Jul 31 Javascript
JS中锚点链接点击平滑滚动并自由调整到顶部位置
Feb 06 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
融入意大利的咖啡文化
2021/03/03 咖啡文化
php 自写函数代码 获取关键字 去超链接
2010/02/08 PHP
PHP实现的二分查找算法实例分析
2017/12/19 PHP
一个不错的用JavaScript实现的UBB编码函数
2007/03/09 Javascript
jquery 实现的全选和反选
2009/04/15 Javascript
IE8下关于querySelectorAll()的问题
2010/05/13 Javascript
JavaScript实现当网页加载完成后执行指定函数的方法
2015/03/21 Javascript
jQuery实现淡入淡出二级下拉导航菜单的方法
2015/08/28 Javascript
javascript中利用柯里化函数实现bind方法
2016/04/29 Javascript
浅谈bootstrap源码分析之tab(选项卡)
2016/06/06 Javascript
Node.js中如何合并两个复杂对象详解
2016/12/31 Javascript
JavaScript BASE64算法实现(完美解决中文乱码)
2017/01/10 Javascript
JavaScript输入框字数实时统计更新
2017/06/17 Javascript
jQuery进阶实践之利用最优雅的方式如何写ajax请求
2017/12/20 jQuery
详解Node.js异步处理的各种写法
2019/06/09 Javascript
记录一次websocket封装的过程
2020/11/23 Javascript
[37:45]完美世界DOTA2联赛PWL S3 LBZS vs Phoenix 第二场 12.09
2020/12/11 DOTA
python调用Delphi写的Dll代码示例
2017/12/05 Python
python TCP Socket的粘包和分包的处理详解
2018/02/09 Python
python下解压缩zip文件并删除文件的实例
2018/04/24 Python
python中cPickle类使用方法详解
2018/08/27 Python
django项目中使用手机号登录的实例代码
2019/08/15 Python
pygame实现俄罗斯方块游戏(基础篇1)
2019/10/29 Python
python的列表List求均值和中位数实例
2020/03/03 Python
Python3.x+pyqtgraph实现数据可视化教程
2020/03/14 Python
在PyTorch中使用标签平滑正则化的问题
2020/04/03 Python
Selenium python时间控件输入问题解决方案
2020/07/22 Python
详解HTML5新增标签
2017/11/27 HTML / CSS
html5在移动端的屏幕适应问题示例探讨
2014/06/15 HTML / CSS
财务人员个人自荐信范文
2013/09/26 职场文书
大学生工作求职信
2014/06/23 职场文书
2014年采购工作总结
2014/11/20 职场文书
保管员岗位职责
2015/02/14 职场文书
2019运动会广播加油稿汇总
2019/08/21 职场文书
python 如何执行控制台命令与操作剪切板
2021/05/20 Python
聊聊SpringBoot自动装配的魔力
2021/11/17 Java/Android