使用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 基础问答三
Dec 03 Javascript
Javascript 调试利器 Firebug使用详解六
Jul 05 Javascript
js substring从右边获取指定长度字符串(示例代码)
Dec 23 Javascript
js 立即调用的函数表达式如何写
Jan 12 Javascript
AngularJS入门教程之AngularJS指令
Apr 18 Javascript
Query常用DIV操作获取和设置长度宽度的实现方法
Sep 19 Javascript
AngularJS实践之使用NgModelController进行数据绑定
Oct 08 Javascript
JavaScript使用readAsDataUrl方法预览图片
May 10 Javascript
Bootstrap实现的标签页内容切换显示效果示例
May 25 Javascript
优雅的在React项目中使用Redux的方法
Nov 10 Javascript
详解在vue-cli3.0中自定css、js和图片的打包路径
Aug 26 Javascript
如何管理Vue中的缓存页面
Feb 06 Vue.js
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自定义函数实现二维数组排序功能
2016/07/20 PHP
javascript-TreeView父子联动效果保持节点状态一致
2007/08/12 Javascript
初学Javascript的一些总结
2008/11/03 Javascript
JavaScript中的运算符种类及其规则介绍
2013/09/26 Javascript
使用JavaScript实现Java的List功能(实例讲解)
2013/11/07 Javascript
jQuery 无刷新分页实例代码
2013/11/12 Javascript
javascript实现控制浏览器全屏
2015/03/30 Javascript
深入学习jQuery Validate表单验证(二)
2016/01/18 Javascript
AngularJS入门教程之表单校验用法示例
2016/11/02 Javascript
vue.js实现单选框、复选框和下拉框示例
2017/07/18 Javascript
Nuxt配合Node在实际生产中的应用详解
2018/08/07 Javascript
jQuery实现数字自动增加或者减少的动画效果示例
2018/12/11 jQuery
如何使用RoughViz可视化Vue.js中的草绘图表
2021/01/30 Vue.js
win7 下搭建sublime的python开发环境的配置方法
2014/06/18 Python
Python脚本实现代码行数统计代码分享
2015/03/10 Python
初步解析Python下的多进程编程
2015/04/28 Python
详解Python的Flask框架中的signals信号机制
2016/06/13 Python
使用Python3 编写简单信用卡管理程序
2016/12/21 Python
python 简单的绘图工具turtle使用详解
2017/06/21 Python
OpenCV哈里斯(Harris)角点检测的实现
2020/01/15 Python
解决Jupyter因卸载重装导致的问题修复
2020/04/10 Python
python工具——Mimesis的简单使用教程
2021/01/16 Python
K近邻法(KNN)相关知识总结以及如何用python实现
2021/01/28 Python
Python爬虫+Tkinter制作一个翻译软件的示例
2021/02/20 Python
python定义具名元组实例操作
2021/02/28 Python
css3 border-radius属性详解
2017/07/05 HTML / CSS
利用CSS3把图片变成灰色模式的实例代码
2016/09/06 HTML / CSS
介绍一下UNIX启动过程
2013/11/14 面试题
经典大学生求职信范文
2014/01/06 职场文书
现金出纳岗位职责
2014/03/15 职场文书
《鲁班和橹板》教学反思
2014/04/27 职场文书
心理健康日活动总结
2014/05/08 职场文书
医学求职自荐信
2014/06/21 职场文书
村主任个人对照检查材料
2014/10/01 职场文书
春季运动会加油词
2015/07/18 职场文书
解决Goland 同一个package中函数互相调用的问题
2021/05/06 Golang