React——共享state

通常,一些组件需要反映相同的数据更改,这种情况推荐将共享state移动到它们最近的公共祖先上。

在这里有一个例子:有一个温度计算器计算在给定温度是否能让水沸腾,用户可以输入华氏温度也能输入摄氏温度,当改变一种温度时另一种温度也要跟着改变
在这里摄氏温度输入框的值与华氏温度输入框的值要相互关联,所以这两个输入框都引用了同一个状态,所以这个共享的状态要位于他们最近的公共祖先上。具体代码如下:

// 温度输入组件
class TemperatureInput extends React.Component{
    handleChange(event){
        this.props.change(this.props.scale,event.target.value);
    }
    render(){
        return <p>
            <label>{this.props.scale === 'c' ? '摄氏温度' : '华氏温度'}:</label>
            <input type='text' value={this.props.value} onChange={this.handleChange.bind(this)}/>
        </p>
    }
}
// 显示是否沸腾的组件
class ShowBoil extends React.Component{
    render(){
        if(this.props.temperature >= 100){
            return <p>The water would boil</p>
        } else {
            return <p>The water would not boil</p>
        }

    }
}
// 温度计算组件
class Calculator  extends React.Component{
    constructor(props){
        super(props);
        this.state = {
            scale:'c',
            temperature:''
        };
    }
    changeState(scale,temperature){
       this.setState({scale,temperature});
    }
    covertTemperature(scale,temperature){
        if(Number.isNaN(parseFloat(temperature))){
            return ''
        }
        // 把摄氏温度转换为华氏温度
        if(scale === 'c'){
            return ((temperature * 9 / 5) + 32) + '';
        }
        // 将华氏温度转换为摄氏温度
        else {
            return ((temperature - 32) * 5 / 9 ) + '';
        }
    }
    render(){
        const scale = this.state.scale;
        const temperature = this.state.temperature;
        const cTemperature = scale === 'f'?this.covertTemperature(scale,temperature):temperature;
        const fTemperature = scale ==='c'?this.covertTemperature(scale,temperature):temperature;
        return (
            <div>
                <TemperatureInput change={this.changeState.bind(this)} value={cTemperature} scale='c'/>
                <TemperatureInput change={this.changeState.bind(this)} value={fTemperature} scale='f'/>
                <ShowBoil temperature={cTemperature}/>
            </div>
        )
    }
}

 

转载于:https://www.cnblogs.com/QxQstar/p/7534884.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值