使用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 相关文章推荐
DOM节点的替换或修改函数replaceChild()用法实例
Jan 12 Javascript
JavaScript使用DeviceOne开发实战(三)仿微信应用
Dec 02 Javascript
逻辑表达式中与或非的用法详解
Jun 06 Javascript
jquery操作ID带有变量的节点实例
Dec 07 Javascript
js实现3D图片环展示效果
Mar 09 Javascript
js实现抽奖效果
Mar 27 Javascript
uploader秒传图片到服务器完整代码
Apr 22 Javascript
JS原生轮播图的简单实现(推荐)
Jul 22 Javascript
canvas+gif.js打造自己的数字雨头像的示例代码
Oct 26 Javascript
vue组件中的数据传递方法
May 14 Javascript
Element输入框带历史查询记录的实现示例
Jan 15 Javascript
node 解析图片二维码的内容代码实例
Sep 11 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
memcached 和 mysql 主从环境下php开发代码详解
2010/05/16 PHP
PHP 基于文件头的文件类型验证类函数
2012/05/01 PHP
memcache命令启动参数中文解释
2014/01/13 PHP
yii2.0框架实现上传excel文件后导入到数据库的方法示例
2020/04/13 PHP
Javascript valueOf 使用方法
2008/12/28 Javascript
基于jquery的当鼠标滚轮到最底端继续加载新数据思路分享(多用于微博、空间、论坛 )
2011/10/10 Javascript
javascript获取下拉列表框当中的文本值示例代码
2013/07/31 Javascript
javascript中call和apply方法浅谈
2013/09/27 Javascript
jquery.idTabs 选项卡使用示例代码
2014/09/03 Javascript
Nodejs学习笔记之Stream模块
2015/01/13 NodeJs
Js获取图片原始宽高的实现代码
2016/05/17 Javascript
js获取当前时间(昨天、今天、明天)
2016/11/23 Javascript
基于JS实现限时抢购倒计时间表代码
2017/05/09 Javascript
React根据宽度自适应高度的示例代码
2017/10/11 Javascript
js中this对象用法分析
2018/01/05 Javascript
webstorm中vue语法的支持详解
2018/05/09 Javascript
浅析Vue 中的 render 函数
2020/02/28 Javascript
vue调用本地摄像头实现拍照功能
2020/08/14 Javascript
Vue如何将页面导出成PDF文件
2020/08/17 Javascript
[37:45]完美世界DOTA2联赛PWL S3 LBZS vs Phoenix 第二场 12.09
2020/12/11 DOTA
python启动应用程序和终止应用程序的方法
2019/06/28 Python
Python并发concurrent.futures和asyncio实例
2020/05/04 Python
Html5实现如何在两个div元素之间拖放图像
2013/03/29 HTML / CSS
美国女性奢华品牌精品店:INTERMIX
2017/10/12 全球购物
alice McCALL官网:澳大利亚时尚品牌
2020/11/16 全球购物
若通过ObjectOutputStream向一个文件中多次以追加方式写入object,为什么用ObjectInputStream读取这些object时会产生StreamCorruptedException?
2016/10/17 面试题
高中化学教学反思
2014/01/13 职场文书
《在山的那边》教学反思
2014/02/23 职场文书
爬山的活动方案
2014/08/16 职场文书
承诺书样本
2014/08/30 职场文书
给校长的一封检讨书
2014/09/20 职场文书
党员违纪检讨书怎么写
2014/11/01 职场文书
学习保证书
2015/01/17 职场文书
Python面向对象编程之类的概念
2021/11/01 Python
Python与C++中梯度方向直方图的实现
2022/03/17 Python
关于Redis的主从复制及哨兵问题
2022/06/16 Redis