学习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的each终止或跳过示例代码
Dec 12 Javascript
Jquery.Form 异步提交表单的简单实例
Mar 03 Javascript
JS+DIV+CSS实现的经典标签切换效果代码
Sep 14 Javascript
javascript对象的创建和访问
Mar 08 Javascript
批量下载对路网图片并生成html的实现方法
Jun 07 Javascript
总结javascript中的六种迭代器
Aug 16 Javascript
js实现添加可信站点、修改activex安全设置,禁用弹出窗口阻止程序
Aug 17 Javascript
轻松掌握JavaScript状态模式
Sep 07 Javascript
jQuery 选择器(61种)整理总结
Sep 26 Javascript
AngularJS自定义控件实例详解
Dec 13 Javascript
vue 实现小程序或商品秒杀倒计时
Apr 14 Javascript
Js利用正则表达式去除字符串的中括号
Nov 23 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
德生PL990的分析评价
2021/03/02 无线电
浅谈PHP语法(1)
2006/10/09 PHP
PHP GD 图像处理组件的常用函数总结
2010/04/28 PHP
php生成扇形比例图实例
2013/11/06 PHP
访问编码后的中文URL返回404错误的解决方法
2014/08/20 PHP
php获取文件后缀的9种方法
2016/03/22 PHP
PHP判断FORM表单或URL参数来的数据是否为整数的方法
2016/03/25 PHP
Laravel框架实现的记录SQL日志功能示例
2018/06/19 PHP
JQuery中根据属性或属性值获得元素(6种情况获取方法)
2013/01/17 Javascript
jQuery+CSS实现菜单滑动伸展收缩(仿淘宝)
2013/03/22 Javascript
javascript实现简单的二级联动
2015/03/19 Javascript
Javascript动态创建表格及删除行列的方法
2015/05/15 Javascript
js实现数组冒泡排序、快速排序原理
2016/03/08 Javascript
浅谈jQuery中的$.extend方法来扩展JSON对象
2017/02/12 Javascript
js控制按钮,防止频繁点击响应的实例
2017/02/15 Javascript
面试常见的js算法题
2017/03/23 Javascript
js排序与重组的实例讲解
2017/08/28 Javascript
ES6学习教程之对象字面量详解
2017/10/09 Javascript
webpack v4 从dev到prd的方法
2018/04/02 Javascript
AjaxFileUpload.js实现异步上传文件功能
2019/04/19 Javascript
jQuery 查找元素操作实例小结
2019/10/02 jQuery
Python 的 Socket 编程
2015/03/24 Python
详解Django中的form库的使用
2015/07/18 Python
python中比较两个列表的实例方法
2019/07/04 Python
python写入数据到csv或xlsx文件的3种方法
2019/08/23 Python
CSS3混合模式mix-blend-mode/background-blend-mode简介
2018/03/15 HTML / CSS
HTML5 移动页面自适应手机屏幕四类方法总结
2017/08/17 HTML / CSS
乌克兰移动电子产品和相关配件的在线商店:iTMag
2020/03/16 全球购物
新东方旗下远程教育网站:新东方在线
2020/03/19 全球购物
一些Unix笔试题和面试题
2013/01/22 面试题
环保公益广告语
2014/03/13 职场文书
监察建议书
2015/02/04 职场文书
2019脱贫攻坚工作总结报告范本!
2019/08/06 职场文书
Pytorch反向传播中的细节-计算梯度时的默认累加操作
2021/06/05 Python
SQL 聚合、分组和排序
2021/11/11 MySQL
Python OpenCV超详细讲解基本功能
2022/04/02 Python