使用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 相关文章推荐
兼容IE和FF的js脚本代码小结(比较常用)
Dec 06 Javascript
jQuery学习笔记之jQuery的事件
Dec 22 Javascript
jquery自动填充勾选框即把勾选框打上true
Mar 24 Javascript
Javascript实现简单的富文本编辑器附演示
Jun 16 Javascript
基于JS实现移动端访问PC端页面时跳转到对应的移动端网页
Dec 24 Javascript
不同js异步函数同步的实现方法
May 28 Javascript
javascript 中的console.log和弹出窗口alert
Aug 30 Javascript
在 Angular 中实现搜索关键字高亮示例
Mar 21 Javascript
面试常见的js算法题
Mar 23 Javascript
在Swiper内如何制作CSS3动画效果示例代码
Dec 07 Javascript
vue2.0 父组件给子组件传递数据的方法
Jan 15 Javascript
详解react组件通讯方式(多种)
May 06 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
2019年漫画销量排行榜:鬼灭登顶 海贼单卷制霸 尾田盛赞鬼灭
2020/03/08 日漫
PHP5.0正式发布 不完全兼容PHP4 新增多项功能
2006/10/09 PHP
php 中英文语言转换类代码
2011/08/11 PHP
PHP冒泡算法详解(递归实现)
2014/11/10 PHP
php发送html格式文本邮件的方法
2015/06/10 PHP
thinkphp5.0自定义验证规则使用方法
2017/11/16 PHP
php微信开发之关注事件
2018/06/14 PHP
javascript 动态添加表格行
2006/06/22 Javascript
基于jquery用于查询操作的实现代码
2010/05/10 Javascript
JQuery 动态扩展对象之另类视角
2010/05/25 Javascript
js调用webservice中的方法实现思路及代码
2013/02/25 Javascript
jQuery实现级联菜单效果(仿淘宝首页菜单动画)
2014/04/10 Javascript
JQuery中使用.each()遍历元素学习笔记
2014/11/08 Javascript
node.js中的console.dir方法使用说明
2014/12/10 Javascript
javascript html5移动端轻松实现文件上传
2020/03/27 Javascript
JS中Json数据的处理和解析JSON数据的方法详解
2016/06/29 Javascript
vue.js实现表格合并示例代码
2016/11/30 Javascript
bootstrap学习使用(导航条、下拉菜单、轮播、栅格布局等)
2016/12/01 Javascript
JS实现快递单打印功能【推荐】
2018/06/21 Javascript
JS数组去重的6种方法完整实例
2018/12/08 Javascript
vue.js的vue-cli脚手架中使用百度地图API的实例
2019/01/21 Javascript
微信小程序图片右边加两行文字的代码
2020/04/23 Javascript
JS实现电脑虚拟键盘的操作
2020/06/24 Javascript
基于Vue全局组件与局部组件的区别说明
2020/08/11 Javascript
JS检测浏览器开发者工具是否打开的方法详解
2020/10/02 Javascript
Python提取支付宝和微信支付二维码的示例代码
2019/02/15 Python
Python实现滑动平均(Moving Average)的例子
2019/08/24 Python
keras 自定义loss层+接受输入实例
2020/06/28 Python
一款利用纯css3实现的360度翻转按钮的实例教程
2014/11/05 HTML / CSS
Melissa香港官网:MDreams
2016/07/01 全球购物
日本小田急百货官网:Odakyu
2018/07/19 全球购物
ToysRus日本官网:玩具反斗城
2018/09/08 全球购物
JD Sports丹麦:英国领先的运动时尚零售商
2020/11/24 全球购物
社团活动总结模板
2014/06/30 职场文书
公司员工离职感言
2015/08/03 职场文书
关于maven依赖 ${xxx.version}报错问题
2022/01/18 Java/Android