学习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 相关文章推荐
一端时间轮换的广告
Jun 26 Javascript
javascript qq右下角滑出窗口 sheyMsg
Mar 21 Javascript
说明你的Javascript技术很烂的五个原因
Apr 26 Javascript
Firefox/Chrome/Safari的中可直接使用$/$$函数进行调试
Feb 13 Javascript
jquery操作复选框(checkbox)的12个小技巧总结
Feb 04 Javascript
JavaScript判断按钮被点击的方法
Dec 13 Javascript
JS实现点击网页判断是否安装app并打开否则跳转app store
Nov 18 Javascript
详解Vue 开发模式下跨域问题
Jun 06 Javascript
67 个节约开发时间的前端开发者的工具、库和资源
Sep 12 Javascript
VUE饿了么树形控件添加增删改功能的示例代码
Oct 17 Javascript
Vue中使用的EventBus有生命周期
Jul 12 Javascript
JavaScript使用小插件实现倒计时的方法讲解
Mar 11 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教程 插件机制在PHP中实现方案
2012/11/02 PHP
PHP获取短链接跳转后的真实地址和响应头信息的方法
2014/07/25 PHP
十个PHP高级应用技巧果断收藏
2015/09/25 PHP
详解ThinkPHP3.2.3验证码显示、刷新、校验
2016/12/29 PHP
php5.x禁用eval的操作方法
2018/10/19 PHP
解决php用mysql方式连接数据库出现Deprecated报错问题
2019/12/25 PHP
javascript的函数
2007/01/31 Javascript
解析URI与URL之间的区别与联系
2013/11/22 Javascript
node中socket.io的事件使用详解
2014/12/15 Javascript
javascript十六进制及二进制转化的方法
2015/05/06 Javascript
Boostrap入门准备之border box
2016/05/09 Javascript
layui文件上传实现代码
2017/05/20 Javascript
浅谈vue项目打包优化策略
2018/09/29 Javascript
微信小程序实现点赞、取消点赞功能
2018/11/02 Javascript
vue实现简单的星级评分组件源码
2018/11/16 Javascript
js打开word文档预览操作示例【不是下载】
2019/05/23 Javascript
利用不到200行代码写一款属于你自己的js类库
2019/07/08 Javascript
layui--js控制switch的切换方法
2019/09/03 Javascript
angular异步验证防抖踩坑实录
2019/12/01 Javascript
vscode 插件开发 + vue的操作方法
2020/06/05 Javascript
[01:04:14]OG vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python备份目录及目录下的全部内容的实现方法
2016/06/12 Python
Python列表推导式与生成器表达式用法示例
2018/02/08 Python
使用Python设计一个代码统计工具
2018/04/04 Python
python调用matlab的m自定义函数方法
2019/02/18 Python
pandas进行时间数据的转换和计算时间差并提取年月日
2019/07/06 Python
Django错误:TypeError at / 'bool' object is not callable解决
2019/08/16 Python
python使用rsa非对称加密过程解析
2019/12/28 Python
健身场所或家用健身设备:Life Fitness
2017/11/01 全球购物
Nike比利时官网:Nike.com (BE)
2019/02/07 全球购物
销售副总经理岗位职责
2013/12/11 职场文书
英文演讲稿开场白
2014/08/25 职场文书
单位实习工作证明怎么写
2014/11/02 职场文书
Python一些基本的图像操作和处理总结
2021/06/23 Python
Python实现灰色关联分析与结果可视化的详细代码
2022/03/25 Python
CSS中float高度塌陷问题的四种解决方案
2022/04/18 HTML / CSS