openks / learn-vue

自定义组件文档
https://openks.github.io/learn-vue
0 stars 0 forks source link

20180402_使用react实现数据同步功能 #99

Open openks opened 6 years ago

openks commented 6 years ago

要求如下

  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, }); } /**

export default Zinput; // Don’t forget to use export default!

```css 
<!-- 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>
  );
}