react中进行状态提升,多个组件公用的组件提到父组件

16 篇文章 0 订阅
8 篇文章 0 订阅

我们使用一个日期和毫秒实时转化的样例作为例子,像图中这种,上面输入日期,下边可以实时转为毫秒,同时毫秒也可以实时转为日期:
在这里插入图片描述
大概思考的方向:
首先需要一个输入组件,承载用户的输入;然后需要一个父组件存放这两个输入组件。如果把state放在子组件中,那再父组件中调用的两个子组件就是完全相互独立的,就不能实时更新,因此我们需要把state提升到父组件中,既然state提升到父组件中了,那么两个子组件中的值都应该来自父组件的传递,子组件中获得的用户的值也应该在父组件中修改,因为state在父组件中(这很重要,组件可以传递的不仅有值还可以传递方法)

import React,{Component} from 'react'
import constant from '../constant/index'

const tomillisecond = (data) =>{
    if(data ==''){
        return ''
    }else{
        return Date.parse(new Date(data))
    }
}

const todate = (millisecond) =>{
    if(millisecond ==''){
        return ''
    }else{
        return new Date(millisecond)
    }
   
}

const Convert = (timer,fun) => {
    return fun(timer)
}

export default class TimerChange extends Component{
    constructor(){
        super()
        this.state = {timer:'', style:'date'}
    }

    handleDateChange(timer){
        this.setState({timer:timer,style:'date'})
    }

    handleMillisecondChange(timer){
        this.setState({timer:timer,style:'millisecond'})
    }

    render(){
        const timer = this.state.timer
        const style = this.state.style
        const date = style === 'millisecond' ? Convert(timer,todate): timer
        const millisecond = style === 'date' ? Convert(timer,tomillisecond) : timer
        return (
            <div>
                <TimerInput 
                    style='date' 
                    timer={date}
                    onTimerChange={(timer) => this.handleDateChange(timer)}
                />
                <TimerInput 
                    style='millisecond' 
                    timer={millisecond}
                    onTimerChange={(timer) => this.handleMillisecondChange(timer)}
                />
            </div>
        )
    }
}

class TimerInput extends Component{
    constructor(){
        super()
    }

    handleChange = (e) =>{
        /* console.log(e.target.value)
        let reg =  /^[1-9]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])\s+(20|21|22|23|[0-1]\d):[0-5]\d:[0-5]\d$/
        let regExp = new RegExp(reg)
        let value = e.target.value
        if(regExp.test(value)){
            this.props.onTimerChange(value)
        }   */
        this.props.onTimerChange(e.target.value) 
    }
    render(){
        const style = this.props.style 
        const format = constant.TIME_FORMAT
        const timer = this.props.timer
        return(
            <fieldset>
                <legend>{format[style]}:</legend>
                <input 
                    value = {timer}
                    onChange = {(e) => this.handleChange(e)}
                />
            </fieldset>
        )
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值