使用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 相关文章推荐
jquery1.4.2 for Visual studio 2010 模板文件
Jul 14 Javascript
jQuery判断复选框是否勾选的原理及示例
May 21 Javascript
深入理解javascript严格模式(Strict Mode)
Nov 28 Javascript
javascript实现的淘宝旅行通用日历组件用法实例
Aug 03 Javascript
原生js实现类似fullpage的单页/全屏滚动
Jan 22 Javascript
自带气泡提示的vue校验插件(vue-verify-pop)
Apr 07 Javascript
微信小程序tabbar不显示解决办法
Jun 08 Javascript
在vue中多次调用同一个定义全局变量的实例
Sep 25 Javascript
浅谈vue项目4rs vue-router上线后history模式遇到的坑
Sep 27 Javascript
angular 表单验证器验证的同时限制输入的实现
Apr 11 Javascript
vue实现滑动到底部加载更多效果
Oct 27 Javascript
Vue 中使用 typescript的方法详解
Feb 17 Javascript
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
《破坏领主》销量已超100万 未来将继续开发新内容
2020/03/08 其他游戏
PHP 服务器配置(使用Apache及IIS两种方法)
2009/06/01 PHP
PHP的Socket网络编程入门指引
2015/08/11 PHP
PHP安装threads多线程扩展基础教程
2015/11/17 PHP
php实现多维数组排序的方法示例
2017/03/23 PHP
PHP一致性hash分布式算法封装类定义与用法示例
2018/08/04 PHP
JavaScript语句可以不以;结尾的烦恼
2007/03/08 Javascript
文本框文本自动补全效果示例分享
2014/01/19 Javascript
JS、DOM和JQuery之间的关系示例分析
2014/04/09 Javascript
js事件冒泡、事件捕获和阻止默认事件详解
2016/08/04 Javascript
浅析jQuery操作select控件的取值和设值
2016/12/07 Javascript
jquery.tableSort.js表格排序插件使用方法详解
2020/08/12 Javascript
Nodejs读取文件时相对路径的正确写法(使用fs模块)
2017/04/27 NodeJs
详解Node.js access_token的获取、存储及更新
2017/06/20 Javascript
用vue的双向绑定简单实现一个todo-list的示例代码
2017/08/03 Javascript
Vue源码解析之数组变异的实现
2018/12/04 Javascript
详解vue中$nextTick和$forceUpdate的用法
2019/12/11 Javascript
[27:08]完美世界DOTA2联赛PWL S2 SZ vs Rebirth 第二场 11.21
2020/11/23 DOTA
Python采用socket模拟TCP通讯的实现方法
2014/11/19 Python
python类继承用法实例分析
2015/05/27 Python
Python正则表达式指南 推荐
2018/10/09 Python
python利用小波分析进行特征提取的实例
2019/01/09 Python
Python实现微信消息防撤回功能的实例代码
2019/04/29 Python
Python pexpect模块及shell脚本except原理解析
2020/08/03 Python
解决Python3.7.0 SSL低版本导致Pip无法使用问题
2020/09/03 Python
Python可视化工具如何实现动态图表
2020/10/23 Python
皮尔·卡丹巴西官方商店:Pierre Cardin
2017/07/21 全球购物
美国50岁以上单身人士约会平台:SilverSingles
2018/06/29 全球购物
毕业生找工作推荐信
2013/11/21 职场文书
销售主管岗位职责
2014/02/08 职场文书
教师党员一句话承诺
2014/03/28 职场文书
计算机网络专业自荐书
2014/06/09 职场文书
一年级数学下册复习计划
2015/01/17 职场文书
2016年六一文艺汇演开幕词
2016/03/04 职场文书
Elasticsearch Recovery 详细介绍
2022/04/19 Java/Android
Python简易开发之制作计算器
2022/04/28 Python