이번에는 리액트 데이터 입력 및 동기화에 대해 다루겠습니다. 리액트 데이터 입력 및 동기화 시 주의사항은 무엇인가요?
요구사항은 다음과 같습니다
입력창에 입력된 내용의 데이터 길이가 0보다 크고 미리보기 정보가 표시됩니다
미리보기 정보에서 커서가 나가고 닫힙니다
The 미리보기 정보는 4자리마다 특수문자_를 삽입하며, 입력 내용은 변경되지 않습니다.
길이는 13자리로 제한됩니다
숫자(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 ? ( <p className="big-show">{ this.getStr(this.state.value,4) }</p> ) : '' return ( <p className="zInput"> <input className="input" type = "text" onFocus={ this.inputOnFocus } onBlur={ this.inputOnBlur } value={ this.state.value } onChange={ this.handleChange }> </input> {showBig} </p> ) } } 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를 사용하여 하위 구성 요소의 상태 값을 직접 가져옵니다
constructor(props) { super(props); this.handerClick2 = this.handerClick2.bind(this); } handerClick2(){ // NOTE 父组件通过refs获取子组件的state console.log("使用ref获取子组件的值",this.refs.zinput.state.value) } render() { return ( <p className="App"> <Zinput ref="zinput"></Zinput> <input type="button" value="获取电话号码的值22" onClick={ this.handerClick2 }/> </p> ); }
2. 하위 컴포넌트의 포커스는 상위 컴포넌트가 전달한 메소드를 호출하여 상위 컴포넌트의 상태값을 수정합니다
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 ( <p className="App"> <Zinput ref="zinput" chanegNumber={this.changePhoneNumber}></Zinput> <input type="button" value="获取电话号码的值" onClick={ this.handerClick }/> </p> ); }
이 글의 사례를 읽어보셨을 거라 생각합니다. 메소드를 마스터하신 후, 관련 글도 참고해주세요. 더 흥미로운 콘텐츠를 보려면 PHP 중국어 웹사이트를 방문하세요!
추천 도서:
vue를 사용하여 단일 페이지 애플리케이션 프런트엔드 라우팅을 만드는 방법
위 내용은 입력 데이터에 반응하고 동기화의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!