为什么 <button onClick={this.props.onClick}> 与 <button onClick={(e) => {this.props.onClick(e)}}> 不同?

IT技术 reactjs
2021-05-10 02:04:13

我在这篇文章中找到了以下代码。(沙箱)我不确定为什么这些按钮的行为不同。

一种可能的解释是:因为没有调用 Button 的 render 方法进行更新,所以第一个按钮的单击处理程序保持不变。但是,Button 实例的 this.props 已更改为包含新的 onClick props。换句话说,如果组件元素的 props发生变化,即使shouldComponentUpdate返回 false nextProps最终也会变成this.props

const submit = val => alert(val);
class App extends React.Component {


state = { val: "one" }

  componentDidMount() {
    this.setState({ val: "two" })
  }

  render() {
    return <Form value={this.state.val} />
  }
}

const Form = props => (
  <Button
    onClick={() => {
      submit(props.value)
    }}
  />
)

class Button extends React.Component {
  shouldComponentUpdate() {
    // lets pretend like we compared everything but functions
    return false
  }

  handleClick = () => this.props.onClick()

  render() {
    return (
      <div>
        <button onClick={this.props.onClick}>This one is stale</button>
        <button onClick={() => this.props.onClick()}>This one works</button>
        <button onClick={this.handleClick}>This one works too</button>
      </div>
    )
  }
}
2个回答

您的解释是正确的,当ShouldComponentUpdate()返回时falseButton组件不会在props更改时重新渲染。

在第一个<button>元素中,onClick事件this.props.OnClick实际上() => { submit("one"); }是初始渲染时的函数"one"在这里是因为在 React 生命周期的这个特定时间点,Form's 的props.value计算结果为"one"请注意,函数被执行与Button's无关props

<button>然而,在第二个元素中,onClick事件是 () => this.props.onClick()不管Button组件是否被重新渲染,它总是this.props.onClick()被执行,this.props当父组件获得 state/props 更新时,它会发生变化。

ShouldComponentUpdate()返回的情况下trueButton组件将在props更新时重新渲染。第一个按钮的onClick事件成为() => { submit("two"); }App组件状态更改触发的重新渲染的新函数这两个按钮元素的onClick事件函数从来都不是同一个函数,尽管它们似乎产生了相同的结果。

<button onClick={this.props.onClick}>将调用您的 onClick 函数并发送一个event对象作为其第一个参数。这相当于这样做:

<button onClick={event => { this.props.onClick(event) }}>

<button onClick={() => this.props.onClick()}> 将您的 onClick 函数返回的内容设置为 onClick 函数...这是以下代码的简短语法:

<button onClick={() => { return this.props.onClick() }}>

您可能正在寻找的是: <button onClick={() => { this.props.onClick() }}>

在这种情况下,单击只会调用您的函数而不发送任何参数

我建议阅读此文档以了解有关箭头/匿名函数及其语法的更多信息