React JS事件处理程序参数

时间:2017-06-07 04:28:09

标签: javascript reactjs

我正在阅读React JS文档中的"Lifting State Up",我不太清楚。可以在此处找到codepen:https://codepen.io/valscion/pen/jBNjja?editors=0010

在TemperatureInput组件中,onTemperatureChange事件处理程序调用handleCelsiusChange,但后者包含一个temperature参数。我们如何传递这个参数? onTemperatureChange中没有传递参数。我在这里缺少什么?

希望有人能帮助我理解这一点。

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>
    );
  }
}

3 个答案:

答案 0 :(得分:0)

这里是您传递函数的TemperatureInput组件(它就像一个指针)。

这是从Calculator传递给TemperatureInput组件。

现在我们看到,我们的函数handleCelsiusChange需要一个参数,因此当我们在TemperatureInput组件中调用onTemperatureChange函数时,我们必须在那里传递一些变量。

如下所示,您可以将参数传递给函数调用。

 handleChange(e) {
    this.props.onTemperatureChange(e.target.value);
  }

这是我们将参数从TemperatureInput组件

传递给函数的地方

答案 1 :(得分:0)

  

在TemperatureInput组件中,onTemperatureChange事件处理程序调用handleCelsiusChange ...

这个假设是不正确的。 您正在将函数对象this.handleCelsiusChange的引用传递给onTemperatureChange函数中的属性render

然后TemperatureInput类中调用它使用此函数对象。

this.props.onTemperatureChange(e.target.value)

如果要在JSX中调用handleCelciusChange,render将如下所示:

    <TemperatureInput
      scale="c"
      temperature={celsius}
      onTemperatureChange={this.handleCelsiusChange(some_value)} />

答案 2 :(得分:0)

让我们先看一下TemperatureInput组件。当其input元素触发change事件时,它由handleChange(e)处理(在TemperatureInput组件中声明)。您会注意到它然后使用参数this.props.onTemperatureChange调用e.target.value(这是输入元素的value属性)。

this.props.onTemperatureChange来自哪里?它由实例化它的父组件Calculator设置。查看Calculator组件的render方法,您会注意到每个TemperatureInput实例的onTemperatureChange prop设置为this.handle[Cel/Far]Change(在Calculator组件中声明的两个方法)。

因此,当TemperatureInput组件调用this.props.onTemperatureChange时,它实际上调用了Calculator组件的handle[Cel/Far]Change方法。