javascript - react-native - 作为参数调用函数

标签 javascript react-native

我隐隐怀疑这个问题可能更多地与 JavaScript 和/或特别是 ES6 相关,而不是 React-Native,但我会尝试。我有以下组件:

export default class Body extends Component {

  componentWillMount() {
    this.refresh();
  }

  clickme() {
    console.log('I have been pressed!!!!!');
  }

  refresh() {
    this.props.populateGrid();
  }
  render() {
    return (
      <View style={styles.body}>
        <Grid inGrid={this.props.grid} />
        <Button
          onPress={this.clickme}
          title={'PressMe'}
        />
      </View>
    );
  }

}

首先,我将“this.clickme()”传递给 onPress。它不起作用。只有在取下牙套后它才开始起作用。为什么?我们通常调用的函数不都是包含()的吗?有时,您必须以以下格式传递它:something={() => this.clickme()}。为什么/何时?

那么我们什么时候调用函数:

1. {this.clickme}
2. {this.clickme()}
3. {() => this.clickme()}

谢谢。

最佳答案

简短回答:

您在问题中定义的 1 和 3 对于 Button.onPress 实际上是相同的 - 它们传递对函数体的引用。然而,#3 还定义了一个新的内联函数,尽管它是以非常轻量级的方式定义的。 #2 尝试内联调用该函数。在某些情况下,您可能需要执行此操作 (#2),即您需要将数字、 bool 值或字符串值传递给属性,而不是像 Button.onPress 所要求的那样传递回调函数。

更长的答案:

所需的语法由您在 react 组件上传递数据的方法的签名定义。在本例中,我们讨论的是 Button.onPress,它具有签名 () => {} ——这意味着它接受一个回调函数,并且在以下情况下不会向其传递任何参数:叫。您不想立即调用该函数,因为在您定义组件时用户没有单击。他们稍后会随机点击。

由于您需要传入函数而不是其结果,因此您不希望在函数名称末尾包含 ()。括号将使函数立即运行,而名称本身只会传递对函数体的引用。该引用稍后将由 Button.onPress 调用来处理用户交互。

许多 JavaScript(和 React)都是通过传递函数引用并随后从其他函数中调用这些函数的模式编写的。如果您不熟悉该模式,一定要花一些时间阅读有关回调模式的内容。

() => {} 也是定义内联匿名函数的简写方式。它称为箭头函数,与定义单独的函数体相比,它可以带来一些性能提升。

更多信息在这里:

关于javascript - react-native - 作为参数调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43194424/

相关文章:

javascript - 如何找到对象的哪些属性包含特定值?

android - 是否有其他替代方法可以为 Android 调整 adjustsFontSizeToFit?

reactjs - react native : Using Hooks in Flatlist

javascript - 在 React Native 应用程序中更新日落主题

javascript - 我正在尝试使用 Javascript 中的 while 循环打印从 10 到 40 的所有偶数

javascript - 如何将短拖动事件解释为点击

ios - 如何在某些数据部分之后将分隔符添加到 FlatList 中?

reactjs - props 数据在使用 react-native 的 componentDidMount 中不起作用

JavaScript 正则表达式 - 如何检查逗号分隔值是否超过三个

javascript - CanvasJS .render() 函数跳转到屏幕顶部