使用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 25 Javascript
jQuery基础_入门必看知识点
Jul 04 Javascript
CSS3 3D 技术手把手教你玩转
Sep 02 Javascript
深入理解Angularjs中的$resource服务
Dec 31 Javascript
js实现鼠标左右移动,图片也跟着移动效果
Jan 25 Javascript
javascript 显示全局变量与隐式全局变量的区别
Feb 09 Javascript
关于Vue背景图打包之后访问路径错误问题的解决
Nov 03 Javascript
vue.js实现点击后动态添加class及删除同级class的实现代码
Apr 04 Javascript
vue-cli3 项目优化之通过 node 自动生成组件模板 generate View、Component
Apr 30 Javascript
Angular中innerHTML标签的样式不起作用的原因解析
Jun 18 Javascript
javascript面向对象创建对象的方式小结
Jul 29 Javascript
如何用JavaScript学习算法复杂度
Apr 30 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
PHP最常用的2种设计模式工厂模式和单例模式介绍
2012/08/14 PHP
变量在 PHP7 内部的实现(二)
2015/12/21 PHP
ThinkPHP使用Smarty第三方插件方法小结
2016/03/19 PHP
Yii2框架实现数据库常用操作总结
2017/02/08 PHP
phpStudy配置多站点多域名和多端口的方法
2017/09/01 PHP
jquery.boxy插件的iframe扩展代码
2010/07/02 Javascript
javascript函数式编程程序员的工具集
2015/10/11 Javascript
jQuery使用cookie与json简单实现购物车功能
2016/04/15 Javascript
Bootstrap教程JS插件弹出框学习笔记分享
2016/05/17 Javascript
在Docker快速部署Node.js应用的详细步骤
2016/09/02 Javascript
jQuery实现的自定义滚动条实例详解
2016/09/20 Javascript
jQuery css() 方法动态修改CSS属性
2016/09/25 Javascript
vue 里面使用axios 和封装的示例代码
2017/09/01 Javascript
浅析Vue项目中使用keep-Alive步骤
2018/07/27 Javascript
jQuery实现点击自身以外区域关闭弹出层功能完整示例【改进版】
2018/07/31 jQuery
微信小程序实现工作时间段选择
2019/02/15 Javascript
[03:18]DOTA2亚洲邀请赛小组赛第一日 RECAP赛事回顾
2015/01/30 DOTA
布同 Python中文问题解决方法(总结了多位前人经验,初学者必看)
2011/03/13 Python
Python爬虫通过替换http request header来欺骗浏览器实现登录功能
2018/01/07 Python
python 拷贝特定后缀名文件,并保留原始目录结构的实例
2018/04/27 Python
python Django框架实现web端分页呈现数据
2019/10/31 Python
python飞机大战pygame游戏之敌机出场实现方法详解
2019/12/17 Python
pycharm设置python文件模板信息过程图解
2020/03/10 Python
python算的上脚本语言吗
2020/06/22 Python
西班牙美妆电商:Perfume’s Club(有中文站)
2018/08/08 全球购物
酒吧员工的岗位职责
2013/11/26 职场文书
大四学生找工作的自荐信
2014/03/27 职场文书
毕业生欢送会主持词
2014/03/31 职场文书
会计专业自荐信
2014/06/03 职场文书
2014应届本科生自我评价
2014/09/13 职场文书
2014民事授权委托书范本
2014/09/29 职场文书
国庆庆典邀请函
2015/02/02 职场文书
小学远程教育工作总结
2015/08/13 职场文书
2019企业文化管理制度范本!
2019/08/06 职场文书
浅析Python中的随机采样和概率分布
2021/12/06 Python
python中validators库的使用方法详解
2022/09/23 Python