学习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 相关文章推荐
jquery multiSelect 多选下拉框
Jul 09 Javascript
JS.findElementById()使用介绍
Sep 21 Javascript
图片动画横条广告带上下滚动可自定义图片、链接等等
Oct 20 Javascript
AngularJS基础学习笔记之指令
May 10 Javascript
jquery实现点击查看更多内容控制段落文字展开折叠效果
Aug 06 Javascript
详解javascript实现自定义事件
Jan 19 Javascript
Javascript函数中的arguments.callee用法实例分析
Sep 16 Javascript
总结Javascript中数组各种去重的方法
Oct 04 Javascript
基于iScroll实现下拉刷新和上滑加载效果
Jul 18 Javascript
vue打包使用Nginx代理解决跨域问题
Aug 27 Javascript
利用JavaScript的Map提升性能的方法详解
Aug 14 Javascript
vue3使用vue-count-to组件的实现
Dec 25 Vue.js
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简单获取随机数的常用方法小结
2017/06/07 PHP
php简单中奖算法(实例)
2017/08/15 PHP
Google Suggest ;-) 基于js的动态下拉菜单
2006/10/11 Javascript
js之WEB开发调试利器:Firebug 下载
2007/01/13 Javascript
IE与firefox下Dhtml的一些区别小结
2009/12/02 Javascript
juqery 学习之三 选择器 可见性 元素属性
2010/11/25 Javascript
JavaScript高级程序设计(第3版)学习笔记11 内建js对象
2012/10/11 Javascript
jQuery写的日历(包括日历的样式及功能)
2013/04/23 Javascript
关注jquery技巧提高jquery技能(前端开发必学)
2015/11/02 Javascript
js实现商城星星评分的效果
2015/12/29 Javascript
js如何准确获取当前页面url网址信息
2020/09/13 Javascript
JS实现列表的响应式排版(推荐)
2016/09/01 Javascript
Javascript动画效果(2)
2016/10/11 Javascript
详解用node-images 打造简易图片服务器
2017/05/08 Javascript
微信小程序 获取session_key和openid的实例
2017/08/17 Javascript
JavaScrip关于创建常量的知识点
2017/12/07 Javascript
jQuery实现table表格checkbox全选的方法分析
2018/07/04 jQuery
Vue实现微信支付功能遇到的坑
2019/06/05 Javascript
详解vue-cli项目在IE浏览器打开报错解决方法
2020/12/10 Vue.js
Python正则替换字符串函数re.sub用法示例
2017/01/19 Python
Python调用ctypes使用C函数printf的方法
2017/08/23 Python
Python装饰器用法实例分析
2019/01/14 Python
python 多个参数不为空校验方法
2019/02/14 Python
Django ORM 查询管理器源码解析
2019/08/05 Python
python3获取文件中url内容并下载代码实例
2019/12/27 Python
将自己的数据集制作成TFRecord格式教程
2020/02/17 Python
Python通过正则库爬取淘宝商品信息代码实例
2020/03/02 Python
利用django创建一个简易的博客网站的示例
2020/09/29 Python
法国最大电子商务平台:Cdiscount
2018/03/13 全球购物
工厂门卫的岗位职责
2014/07/27 职场文书
党支部创先争优活动总结
2014/08/28 职场文书
运动会报道稿300字
2014/10/02 职场文书
成绩报告单家长评语
2014/12/30 职场文书
网络舆情信息简报
2015/07/21 职场文书
Python快速优雅的批量修改Word文档样式
2021/05/20 Python
PyQt5结合QtDesigner实现文本框读写操作
2021/06/11 Python