zoukankan      html  css  js  c++  java
  • 9、ReactJs基础知识09--状态提升

    当你遇到需要同时获取多个子组件数据,或者两个组件之间需要相互通讯的情况时,需要把子组件的 state 数据提升至其共同的父组件当中保存。之后父组件可以通过 props 将状态数据传递到子组件当中。这样应用当中所有组件的状态数据就能够更方便地同步共享了。

    然后把父组件修改state的函数传递给子组件,实现数据的更新

        // 是否烧开组件
          function BoilingVerdict(props) {
            if (props.celsius >= 100) {
              return <p>The water would boil.</p>;
            }
            return <p>The water would not boil.</p>;
          }
          // 转换函数toCelsius
          function toCelsius(fahrenheit) {
            return (fahrenheit - 32) * 5 / 9;
          }
          // 转换函数toFahrenheit
          function toFahrenheit(celsius) {
            return (celsius * 9 / 5) + 32;
          }
          function tryConvert(temperature, convert) {
            const input = parseFloat(temperature);
            if (Number.isNaN(input)) {
              return '';
            }
            const output = convert(input);
            const rounded = Math.round(output * 1000) / 1000;
            return rounded.toString();
          }
    
          const scaleNames = {
            c: 'Celsius',
            f: 'Fahrenheit'
          };
          class TemperatureInput extends React.Component {
            constructor(props) {
              super(props);
              this.handleChange = this.handleChange.bind(this);
            }
    
            handleChange(e) {
              this.props.onTemperatureChange(e.target.value);
            }
    
            render() {
              const temperature = this.props.temperature;
              const scale = this.props.scale;
              return (
                <fieldset>
                  <legend>Enter temperature in {scaleNames[scale]}:</legend>
                  <input value={temperature}
                        onChange={this.handleChange} />
                </fieldset>
              );
            }
          }
    
          class Calculator extends React.Component {
            constructor(props) {
              super(props);
              this.handleCelsiusChange = this.handleCelsiusChange.bind(this);
              this.handleFahrenheitChange = this.handleFahrenheitChange.bind(this);
              this.state = {temperature: '', scale: 'c'};
            }
    
            handleCelsiusChange(temperature) {
              this.setState({scale: 'c', temperature});
            }
    
            handleFahrenheitChange(temperature) {
              this.setState({scale: 'f', temperature});
            }
    
            render() {
              const scale = this.state.scale;
              const temperature = this.state.temperature;
              const celsius = scale === 'f' ? tryConvert(temperature, toCelsius) : temperature;
              const fahrenheit = scale === 'c' ? tryConvert(temperature, toFahrenheit) : temperature;
    
              return (
                <div>
                  <TemperatureInput
                    scale="c"
                    temperature={celsius}
                    onTemperatureChange={this.handleCelsiusChange} />
    
                  <TemperatureInput
                    scale="f"
                    temperature={fahrenheit}
                    onTemperatureChange={this.handleFahrenheitChange} />
    
                  <BoilingVerdict
                    celsius={parseFloat(celsius)} />
                </div>
              );
            }
          }
          ReactDOM.render(
            <Calculator />,
            document.getElementById('root')
          );
     
  • 相关阅读:
    [loj3364]植物比较
    [loj3366]嘉年华奖券
    [atARC105F]Lights Out on Connected Graph
    [atARC105D]Let's Play Nim
    [atARC058F]Lroha Loves Strings
    [loj3347]有趣的旅途
    [atAGC001F]Wide Swap
    [cf1392I]Kevin and Grid
    [loj3340]命运
    [loj3046]语言
  • 原文地址:https://www.cnblogs.com/gopark/p/12292744.html
Copyright © 2011-2022 走看看