react-native onPress绑定参数

Was*_*and 42 binding react-native

期望的行为是将参数(文本)传递给onClick处理程序到console.log它,但似乎我在做错了语法.

如果我把论点排除在下面,它的工作正常:

export default class Nav extends Component {
  componentDidMount() {
    this.props.pickNumber(3);
  }

  onPress() {
    console.log('FOOOBAAR');
  }
  render() {
    return (
      <View>
        <Text>####################</Text>
        <Text>Intro Screen</Text>
        <Text>Number: {this.props.numbers}</Text>
        <TouchableHighlight onPress={this.onPress.bind(this)}>
          <Text>Go to Foo</Text>
        </TouchableHighlight>
      </View>
    );
  }

}
Run Code Online (Sandbox Code Playgroud)

但是,如果我想将参数传递给onPress处理程序,它会抱怨'无法读取未定义的属性'bind'.

export default class Nav extends Component {
  componentDidMount() {
    this.props.pickNumber(3);
  }

  onPress(txt) {
    console.log(txt);
  }
  render() {
    return (
      <View>
        <Text>####################</Text>
        <Text>Intro Screen</Text>
        <Text>Number: {this.props.numbers}</Text>
        <TouchableHighlight onPress={this.onPress('foo').bind(this)}>
          <Text>Go to Foo</Text>
        </TouchableHighlight>
      </View>
    );
  }

}
Run Code Online (Sandbox Code Playgroud)

谢谢

增加:如果我将其更改为:

onPress={this.onPress.bind('foo')}
Run Code Online (Sandbox Code Playgroud)

它也不起作用.

ing*_*nga 50

您可以使用ES6在构造函数中进行绑定:

export default class Nav extends Component {
  constructor(props) {
    super(props);

    this.onPress = this.onPress.bind(this);
  }
Run Code Online (Sandbox Code Playgroud)

然后

  onPress(txt) {
    console.log(txt);
  }

  render() {
    return (
      <View>
        <Text>####################</Text>
        <Text>Intro Screen</Text>
        <Text>Number: {this.props.numbers}</Text>
        <TouchableHighlight onPress={() => this.onPress('foo')}>
          <Text>Go to Foo</Text>
        </TouchableHighlight>
      </View>
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 使用`onPress = {()=>}时不需要绑定函数,因为它是自动完成的 (8认同)
  • 没有胖箭头功能,我们正在执行一个函数,而不是给onPress一个函数,所以我们需要箭头函数来为onPress创建一个函数. (2认同)
  • 你使用胖箭头的原因如下:`this.onPress.bind(this)`返回绑定函数,并将其传递给`onPress` prop.但是,没有胖箭头的`this.onPress('foo')`将立即使用参数`foo`调用函数`onPress`.由于此函数没有显式返回任何内容,因此返回`undefined`,这是传递给`onPress` prop的内容.但是,`onPress`属性期望只有在用户点击后才能执行一个函数.`()=>`使用ES6语法创建(并返回)一个函数. (2认同)

Gul*_*ous 28

您可以通过在onPress值上绑定它并在'this'之后传递参数来避免在构造函数中绑定函数.构造函数模式很好但是我越是进入OO领域,感觉就越令人讨厌.您可以像这样重构代码,

export default class Nav extends Component {
  componentDidMount() {
    this.props.pickNumber(3);
  }

  onPress(txt) {
    console.log(txt);  // foo
  }
  render() {
    return (
      <View>
        <Text>####################</Text>
        <Text>Intro Screen</Text>
        <Text>Number: {this.props.numbers}</Text>
        <TouchableHighlight onPress={this.onPress.bind(this,'foo')}>
          <Text>Go to Foo</Text>
        </TouchableHighlight>
      </View>
    );
  }

}
Run Code Online (Sandbox Code Playgroud)

第一个参数是'this',之后可以提供任何其他参数,这些参数将以相同的顺序接收.

  • eslint 不太喜欢这样:https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-no-bind.md (2认同)

Tec*_*Tim 16

你也可以用胖箭来解决它:

export default class Nav extends Component {

  handlePress = (text) => {
    console.log(text);
  }

  render() {
    return (
      <View>
        <Text>####################</Text>
        <Text>Intro Screen</Text>
        <Text>Number: {this.props.numbers}</Text>
        <TouchableHighlight onPress={() => this.handlePress('weeeeee')}>
          <Text>Go to Foo</Text>
      </TouchableHighlight>
    </View>
    );
  }
}
Run Code Online (Sandbox Code Playgroud)


小智 8

在调用函数之前,您应该只传递一个胖箭头函数.

onPress= {()=> this.handlePress(param)}
Run Code Online (Sandbox Code Playgroud)