学习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支持firefox,ie7页面布局拖拽效果代码
Dec 20 Javascript
javascript qq右下角滑出窗口 sheyMsg
Mar 21 Javascript
JavaScript中继承的一些示例方法与属性参考
Aug 07 Javascript
js判断背景图片是否加载成功使用img的width实现
May 29 Javascript
jQuery中hasClass()方法用法实例
Jan 06 Javascript
AngularJS页面访问时出现页面闪烁问题的解决
Mar 06 Javascript
使用JavaScript判断手机浏览器是横屏还是竖屏问题
Aug 02 Javascript
浅谈Vue 初始化性能优化
Aug 31 Javascript
使用Node.js实现ORM的一种思路详解(图文)
Oct 24 Javascript
使用 Node.js 开发资讯爬虫流程
Jan 07 Javascript
layui结合form,table的全选、反选v1.0示例讲解
Aug 15 Javascript
vue+element tabs选项卡分页效果
Jun 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 上传文件类型判断函数(避免上传漏洞 )
2010/06/08 PHP
PHP页面间参数传递的四种方法详解
2013/06/09 PHP
windows7下安装php的imagick和imagemagick扩展教程
2014/07/04 PHP
linux下实现定时执行php脚本
2015/02/13 PHP
PHP树的深度编历生成迷宫及A*自动寻路算法实例分析
2015/03/10 PHP
PHP代码实现表单数据验证类
2015/07/28 PHP
php加密解密字符串示例
2016/10/13 PHP
PHP有序表查找之二分查找(折半查找)算法示例
2018/02/09 PHP
html数组字符串拼接的最快方法
2009/09/16 Javascript
ExtJs GridPanel简单的增删改实现代码
2010/08/26 Javascript
js判断IE6/IE7/FF的代码[XMLHttpRequest]
2011/02/16 Javascript
jquery插件开发之实现google+圈子选择功能
2014/03/10 Javascript
jQuery中wrapAll()方法用法实例
2015/01/16 Javascript
详解ES6中的let命令
2020/04/05 Javascript
浅谈Angular6的服务和依赖注入
2018/06/27 Javascript
Jquery的Ajax技术使用方法
2019/01/21 jQuery
高效jQuery选择器的5个技巧实例分析
2019/11/26 jQuery
vue中实现动态生成二维码的方法
2020/02/21 Javascript
如何在现代JavaScript中编写异步任务
2021/01/31 Javascript
python使用pymysql实现操作mysql
2016/09/13 Python
Python实现XML文件解析的示例代码
2018/02/05 Python
python图书管理系统
2020/04/05 Python
python实现删除列表中某个元素的3种方法
2020/01/15 Python
Python中的With语句的使用及原理
2020/07/29 Python
详解python爬取弹幕与数据分析
2020/11/14 Python
分布式全文检索引擎ElasticSearch原理及使用实例
2020/11/14 Python
python中_del_还原数据的方法
2020/12/09 Python
Python实现网络聊天室的示例代码(支持多人聊天与私聊)
2021/01/27 Python
matplotlib 范围选区(SpanSelector)的使用
2021/02/24 Python
CSS3+JavaScript实现炫酷呼吸效果的示例代码
2020/06/15 HTML / CSS
Zavvi西班牙:电子游戏、极客服装、Blu-ray、Funko Pop等
2019/05/03 全球购物
Kusmi茶美国官网:优质散叶茶和茶包
2019/10/13 全球购物
拓展培训心得体会
2014/01/04 职场文书
公务员转正考察材料
2014/02/07 职场文书
2016年世界人口日宣传活动总结
2016/04/05 职场文书
【海涛教你打DOTA】剑圣第一人称视角解说
2022/04/01 DOTA