学习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 相关文章推荐
js通过location.search来获取页面传来的参数
Sep 11 Javascript
jQuery中appendTo()方法用法实例
Jan 08 Javascript
jQuery中Ajax的get、post等方法详解
Jan 20 Javascript
JQuery操作元素的css样式
Mar 09 Javascript
jQuery的几个我们必须了解的特点
May 03 Javascript
JS实现六位字符密码输入器功能
Aug 19 Javascript
ES6新特性一: let和const命令详解
Apr 20 Javascript
Bootstrap Table快速完美搭建后台管理系统
Sep 20 Javascript
用Axios Element实现全局的请求loading的方法
Mar 15 Javascript
详解webpack打包后如何调试的方法步骤
Nov 07 Javascript
Node.js使用supervisor进行开发中调试的方法
Mar 26 Javascript
微信小程序实现点击卡片 翻转效果
Sep 04 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 之入门篇
2006/12/04 PHP
浅谈apache和nginx的rewrite的区别
2013/02/22 PHP
基于php设计模式中工厂模式详细介绍
2013/05/15 PHP
PHP中time(),date(),mktime()区别介绍
2013/09/28 PHP
使用ltrace工具跟踪PHP库函数调用的方法
2016/04/25 PHP
ThinkPHP5.0 图片上传生成缩略图实例代码说明
2018/06/20 PHP
检测jQuery.js是否已加载的判断代码
2011/05/20 Javascript
JQuery魔力之$(&quot;tagName&quot;)与selector
2012/03/05 Javascript
jQuery实现简单滚动动画效果
2016/04/07 Javascript
微信小程序 swiper组件轮播图详解及实例
2016/11/16 Javascript
基于vue2.0+vuex的日期选择组件功能实现
2017/03/13 Javascript
浅析Angular2子模块以及异步加载
2017/04/24 Javascript
原生JS实现图片懒加载(lazyload)实例
2017/06/13 Javascript
认识jQuery的Promise的具体使用方法
2017/10/10 jQuery
JS简单实现查看文档创建日期、修改日期和文档大小的方法示例
2018/04/08 Javascript
微信小程序实现循环动画效果
2018/07/16 Javascript
vue下拉菜单组件(含搜索)的实现代码
2018/11/25 Javascript
详解Nuxt.js中使用Element-UI填坑
2019/09/06 Javascript
JavaScript生成一个不重复的ID的方法示例
2019/09/16 Javascript
vue3修改link标签默认icon无效问题详解
2019/10/09 Javascript
整理 node-sass 安装失败的原因及解决办法(小结)
2020/02/19 Javascript
vue实现登录、注册、退出、跳转等功能
2020/12/23 Vue.js
Windows上配置Emacs来开发Python及用Python扩展Emacs
2015/11/20 Python
Python 私有函数的实例详解
2017/09/11 Python
python创建文件备份的脚本
2018/09/11 Python
Urban Decay官方网站:美国化妆品品牌
2020/06/04 全球购物
淘宝活动策划方案
2014/02/06 职场文书
2014迎新年晚会策划方案
2014/02/23 职场文书
大学生会计职业生涯规划范文
2014/02/28 职场文书
幼儿园儿童节活动主持词+串词大全
2014/03/21 职场文书
校园运动会广播稿
2015/08/19 职场文书
新西兰:最新留学学习计划书写作指南
2019/07/15 职场文书
JDBC连接的六步实例代码(与mysql连接)
2021/05/12 MySQL
CSS极坐标的实例代码
2021/06/03 HTML / CSS
画错魏国疆域啦!《派对咖孔明》动画因作画失误于官网致歉
2022/04/07 日漫
openEuler 搭建java开发环境的详细过程
2022/06/10 Servers