学习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实现页面打印的三种方法
Mar 05 Javascript
javascript 拖放效果实现代码
Jan 22 Javascript
JavaScript CSS修改学习第六章 拖拽
Feb 19 Javascript
javascript 异步页面查询实现代码(asp.net)
May 26 Javascript
Easy.Ajax 部分源代码 支持文件上传功能, 兼容所有主流浏览器
Feb 24 Javascript
表格奇偶行设置不同颜色的核心JS代码
Dec 24 Javascript
浅谈jQuery中的事件
Mar 23 Javascript
bootstrap table实例详解
Jan 06 Javascript
vue学习教程之带你一步步详细解析vue-cli
Dec 26 Javascript
使用D3.js创建物流地图的示例代码
Jan 27 Javascript
jQuery中event.target和this的区别详解
Aug 13 jQuery
vue+django实现下载文件的示例
Mar 24 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
浅析ThinkPHP的模板输出功能
2014/07/01 PHP
详解PHP中的PDO类
2015/07/06 PHP
ThinkPHP开发框架函数详解:C方法
2015/08/14 PHP
四个PHP非常实用的功能
2015/09/29 PHP
如何通过View::first使用Laravel Blade的动态模板详解
2017/09/21 PHP
php使用socket调用http和smtp协议实例小结
2019/07/26 PHP
firefox浏览器下javascript 拖动层效果与原理分析代码
2007/12/04 Javascript
JMenuTab简单使用说明
2008/03/13 Javascript
jquery如何把参数列严格转换成数组实现思路
2013/04/01 Javascript
jQuery制作仿腾讯web qq用户体验桌面
2013/08/20 Javascript
基于MVC3方式实现下拉列表联动(JQuery)
2013/09/02 Javascript
js中函数调用的两种常用方法使用介绍
2014/07/17 Javascript
javascript模拟post提交隐藏地址栏的参数
2014/09/03 Javascript
JS实现很酷的水波文字特效实例
2015/02/26 Javascript
jquery中ready()函数执行的时机和window的load事件比较
2015/06/22 Javascript
EasyUi中的Combogrid 实现分页和动态搜索远程数据
2016/04/01 Javascript
批量下载对路网图片并生成html的实现方法
2016/06/07 Javascript
javascript 删除数组元素和清空数组的简单方法
2017/02/24 Javascript
easyui datagrid 表格中操作栏 按钮图标不显示的解决方法
2017/07/27 Javascript
Vue监听一个数组id是否与另一个数组id相同的方法
2018/09/26 Javascript
javascript系统时间设置操作示例
2019/06/17 Javascript
Vue.js实现立体计算器
2020/02/22 Javascript
Vue.js中使用Vuex实现组件数据共享案例
2020/07/31 Javascript
Python常见格式化字符串方法小结【百分号与format方法】
2016/09/18 Python
简单易懂的python环境安装教程
2017/07/13 Python
pandas多级分组实现排序的方法
2018/04/20 Python
Python面向对象程序设计类的多态用法详解
2019/04/12 Python
python文本数据处理学习笔记详解
2019/06/17 Python
Python中sys模块功能与用法实例详解
2020/02/26 Python
python与c语言的语法有哪些不一样的
2020/09/13 Python
HTML5 video 事件应用示例
2014/09/11 HTML / CSS
为什么在使用动态 SQL 语句时必须为低层数据库对象授予权限
2012/12/13 面试题
英语翻译系毕业生求职信
2013/09/29 职场文书
中学生操行评语大全
2014/04/24 职场文书
合作协议书模板
2014/10/10 职场文书
小学美术教学反思
2016/02/17 职场文书