使用react实现手机号的数据同步显示功能的示例代码


Posted in Javascript onApril 03, 2018

本文介绍了使用react实现手机号的数据同步显示功能的示例代码,分享给大家,具体如下:

要求如下

  1. 输入框输入内容数据长度大于0,展示出预览信息
  2. 光标离开关闭预览信息
  3. 预览信息每隔4位插入一个特殊字符_,输入内容不变
  4. 限制长度为13位
  5. 只允许输入数字(0-9)
// Zinput.js
import React, {
 Component
} from 'react';
import './Zinput.css'

// NOTE: 获取焦点事件 原生onFocus 即可
// NOTE: 离开焦点事件 原生onBlur即可
// NOTE: 输入框数据过滤 直接在change方法里进行过滤
// NOTE: 条件处理 通过不同条件返回不同节点做条件处理
class Zinput extends Component {
 constructor(props) {
  super(props);
  this.state = {
   value: '',
   showBig: false,
  };
  this.handleChange = this.handleChange.bind(this);
  this.inputOnFocus = this.inputOnFocus.bind(this);
  this.inputOnBlur = this.inputOnBlur.bind(this);
 }
 inputOnFocus() {
  if (this.state.value.length > 0) {
   this.setState({
    showBig: true
   })
  }
 }
 inputOnBlur() {
  this.setState({
   showBig: false
  })
  if(this.props.chanegNumber){
   this.props.chanegNumber(this.state.value)
  }
 }
 handleChange(event) {
  let val = event.target.value.substr(0, 13)
   .replace(/[^\d]/g, '')
  event.target.value = val
  this.setState({
   value: val,
   showBig: true,
  });
 }
 /**
  * 根据字符串没隔len位插入一个下滑杠,返回处理后的字符串
  * @method  getStr
  * @author 朱阳星
  * @datetime 2018-04-02T09:57:58+080
  * @email  zhuyangxing@foxmail.com
  * @param  {String} str 待处理字符串
  * @param  {Number} len 每隔位数插入下滑杠
  * @return  {String} 处理后的字符串
  */
 getStr(str, len) {
  let lenth = str.length
  let len1 = len - 1
  let newStr = ''
  for (var i = 0; i < lenth; i++) {
   if (i % len === len1 && i > 0) {
    newStr += str.charAt(i) + '_'
   } else {
    newStr += str.charAt(i)
   }
  }
  if (newStr.length % (len + 1) === 0) {
   // 解决最后一位为补充项问题
   newStr = newStr.substr(0, newStr.length - 1)
  }
  return newStr
 }
 render() {
  // NOTE return 需要用圆括号包住并处理
  // NOTE 条件语句里没有节点也要用空字符串进行处理 否则sonalint会报错,页面也会报错
  const showBig = this.state.showBig ? (
   <div className="big-show">{ this.getStr(this.state.value,4) }</div>
  ) : ''
  return (
   <div className="zInput">
    <input className="input" 
        type = "text" 
        onFocus={ this.inputOnFocus }
        onBlur={ this.inputOnBlur }
        value={ this.state.value } 
        onChange={ this.handleChange }>
        </input>
    {showBig}
   </div>
  )
 }
}

export default Zinput; // Don't forget to use export default!
<!-- Zinput.css -->
.zInput{
  position: absolute;
  top:80px;
  left:40px;
  
}
.input {
 position: absolute;
 top: 0;
 left: 0;
}
.big-show {
  position: relative;
  top: -40px;
  font-size: 36px;
  line-height: 40px;
  background-color: red;
}

功能虽然实现,但是肯定是作为某个节点的某个子组件使用的,父组件调用方法有两种

1.使用refs直接获取子组件state的值

constructor(props) {
 super(props);
 this.handerClick2 = this.handerClick2.bind(this);
}
handerClick2(){
 // NOTE 父组件通过refs获取子组件的state 
 console.log("使用ref获取子组件的值",this.refs.zinput.state.value)
}
render() {
 return (
  <div className="App">
   <Zinput ref="zinput"></Zinput>
   <input type="button" value="获取电话号码的值22" onClick={ this.handerClick2 }/>
  </div> 
 );
}

2.每次子组件焦点离开时调用父组件传过来的方法,修改父组件state值

constructor(props) {
 super(props);
 this.state = {
  phoneNumber: '',
 };
 this.handerClick = this.handerClick.bind(this);
 this.changePhoneNumber = this.changePhoneNumber.bind(this);
}
changePhoneNumber(number){
 this.setState({
   phoneNumber: number,
 })
}
handerClick(){
 // NOTE 根据react的思想是在子组件处理完某件事的时候调用父组件的方法修改父组件的state值
 console.log("使用state获取值",this.state.phoneNumber)
}
render() {
 return (
  <div className="App">
   <Zinput ref="zinput" chanegNumber={this.changePhoneNumber}></Zinput>
   <input type="button" value="获取电话号码的值" onClick={ this.handerClick }/>
  </div>
 );
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript天然的迭代器
Oct 29 Javascript
从JQuery源码分析JavaScript函数的apply方法与call方法
Sep 25 Javascript
JQuery实现动态添加删除评论的方法
May 18 Javascript
概述一个页面从输入URL到页面加载完的过程
Dec 16 Javascript
详解能在多种前端框架下使用的表格控件
Jan 11 Javascript
JS百度地图搜索悬浮窗功能
Jan 12 Javascript
Vue实现自带的过滤器实例
Mar 09 Javascript
ES6与CommonJS中的模块处理的区别
Jun 13 Javascript
小程序从手动埋点到自动埋点的实现方法
Jan 24 Javascript
微信小程序用户授权弹窗 拒绝时引导用户重新授权实现
Jul 29 Javascript
vue 移动端记录页面浏览位置的方法
Mar 11 Javascript
jQuery实现简单评论功能
Aug 19 jQuery
JS遍历DOM文档树的方法实例详解
Apr 03 #Javascript
JavaScript同源策略和跨域访问实例详解
Apr 03 #Javascript
vue 组件中slot插口的具体用法
Apr 03 #Javascript
react 实现页面代码分割、按需加载的方法
Apr 03 #Javascript
深入浅析Vue中的slots/scoped slots
Apr 03 #Javascript
使用FileReader API创建Vue文件阅读器组件
Apr 03 #Javascript
vue内置指令详解
Apr 03 #Javascript
You might like
详解php的魔术方法__get()和__set()使用介绍
2012/09/19 PHP
php读取文件内容的几种方法详解
2013/06/26 PHP
ThinkPHP中自定义错误页面和提示页面实例
2014/11/22 PHP
实例介绍PHP中zip_open()函数用法
2019/02/15 PHP
php设计模式之策略模式应用案例详解
2019/06/17 PHP
记Laravel调用Gin接口调用formData上传文件的实现方法
2019/12/12 PHP
Array.prototype.slice.apply的使用方法
2010/03/17 Javascript
通过length属性判断jquery对象是否存在
2013/10/18 Javascript
jQuery Form 页面表单提交的小例子
2013/11/15 Javascript
jquery1.9 下检测浏览器类型和版本的方法
2013/12/26 Javascript
封装好的一个万能检测表单的方法
2015/01/21 Javascript
JS往数组中添加项性能分析
2015/02/25 Javascript
基于jQuery.Hz2Py.js插件实现的汉字转拼音特效
2015/05/07 Javascript
写给小白的JavaScript引擎指南
2015/12/04 Javascript
AngularJS Ajax详解及示例代码
2016/08/17 Javascript
AngularJS指令与控制器之间的交互功能示例
2016/12/14 Javascript
javascript实现Emrips反质数枚举的示例代码
2017/12/06 Javascript
对angularJs中ng-style动态改变样式的实例讲解
2018/09/30 Javascript
vue项目中播放rtmp视频文件流的方法
2020/09/17 Javascript
JavaScript this关键字的深入详解
2021/01/14 Javascript
Python 变量类型及命名规则介绍
2013/06/08 Python
Python正则表达式的使用范例详解
2014/08/08 Python
Python中itertools模块用法详解
2014/09/25 Python
pygame学习笔记(3):运动速率、时间、事件、文字
2015/04/15 Python
Python算法输出1-9数组形成的结果为100的所有运算式
2017/11/03 Python
Tensorflow环境搭建的方法步骤
2018/02/07 Python
Django集成搜索引擎Elasticserach的方法示例
2019/06/04 Python
一篇文章搞定Python操作文件与目录
2019/08/13 Python
Python 操作SQLite数据库的示例
2020/10/16 Python
CSS3之背景尺寸Background-size使用介绍
2013/10/14 HTML / CSS
中粮集团旗下食品网上购物网站:我买网
2016/09/22 全球购物
保密工作目标责任书
2014/07/28 职场文书
房地产端午节活动方案
2014/08/24 职场文书
会计试用期自我评价
2014/09/19 职场文书
python 开心网和豆瓣日记爬取的小爬虫
2021/05/29 Python
win11自动弹出虚拟键盘怎么关闭? Win11关闭虚拟键盘的技巧
2023/01/09 数码科技