使用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 相关文章推荐
线路分流自动跳转代码;希望对大家有用!
Dec 02 Javascript
FireFox JavaScript全局Event对象
Jun 14 Javascript
jQuery Flash/MP3/Video多媒体插件
Jan 18 Javascript
禁止你的左键复制实用技巧
Jan 04 Javascript
js中typeof的用法汇总
Dec 12 Javascript
js Calender控件使用详解
Jan 05 Javascript
jQuery过滤HTML标签并高亮显示关键字的方法
Aug 07 Javascript
js限制input只能输入有效的数字(第一个不能是小数点)
Sep 28 Javascript
在Koa.js中实现文件上传的接口功能
Oct 08 Javascript
Vue extend的基本用法(实例详解)
Dec 09 Javascript
vue2.0 解决抽取公用js的问题
Jul 31 Javascript
Openlayers实现距离面积测量
Sep 28 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
全国FM电台频率大全 - 3 河北省
2020/03/11 无线电
基于php判断客户端类型
2016/10/14 PHP
PHP文件上传处理案例分析
2016/10/15 PHP
Yii2 queue的队列使用详解
2019/07/19 PHP
[转]JS宝典学习笔记
2007/02/07 Javascript
解决extjs在firefox中关闭窗口再打开后iframe中js函数访问不到的问题
2008/11/06 Javascript
jquery事件机制扩展插件 jquery鼠标右键事件
2011/12/21 Javascript
js中scrollHeight,scrollWidth,scrollLeft,scrolltop等差别介绍
2012/05/16 Javascript
extjs 04_grid 单击事件新发现
2012/11/27 Javascript
js数组如何添加json数据及js数组与json的区别
2015/10/27 Javascript
12个超实用的JQuery代码片段
2015/11/02 Javascript
基于JavaScript实现简单的随机抽奖小程序
2016/01/05 Javascript
AngularJs验证重复密码的方法(两种)
2016/11/25 Javascript
jquery easyui如何实现格式化列
2017/07/30 jQuery
详解webpack + vue + node 打造单页面(入门篇)
2017/09/23 Javascript
详解vue 单页应用(spa)前端路由实现原理
2018/04/04 Javascript
小程序中this.setData的使用和注意事项
2019/08/28 Javascript
Jquery让form表单异步提交代码实现
2019/11/14 jQuery
[01:37]TI4西雅图DOTA2前线报道 VG拿下首胜教练357给出获胜秘诀
2014/07/10 DOTA
python使用pil进行图像处理(等比例压缩、裁剪)实例代码
2017/12/11 Python
ubuntu环境下python虚拟环境的安装过程
2018/01/07 Python
jupyter notebook引用from pyecharts.charts import Bar运行报错
2020/04/23 Python
深入浅析Python的类
2018/06/22 Python
python爬虫之爬取百度音乐的实现方法
2019/08/24 Python
在tensorflow中实现去除不足一个batch的数据
2020/01/20 Python
Pandas将列表(List)转换为数据框(Dataframe)
2020/04/24 Python
Tensorflow tf.tile()的用法实例分析
2020/05/22 Python
python判断正负数方式
2020/06/03 Python
美国机场停车位预订:About Airport Parking
2018/03/26 全球购物
英国在线电子和小工具商店:TecoBuy
2018/10/06 全球购物
口头翻译求职人自荐信
2013/12/07 职场文书
大学生标准自荐书
2014/06/15 职场文书
院党委组织查摆问题对照检查材料思想汇报2014
2014/10/08 职场文书
2014小学年度工作总结
2014/12/20 职场文书
浅谈JS和Nodejs中的事件驱动
2021/05/05 NodeJs
css布局巧妙技巧之css三角示例的运用
2022/03/16 HTML / CSS