react-native onPress 与参数绑定

Posted

技术标签:

【中文标题】react-native onPress 与参数绑定【英文标题】:react-native onPress binding with an argument 【发布时间】:2017-08-18 11:20:24 【问题描述】:

所需的行为是将参数(文本)传递给 onClick 处理程序以对其进行控制台记录,但似乎我的语法有问题。

如果我将论点如下所示,它可以正常工作:

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


但是,如果我想将参数传递给 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>
    );
  


谢谢

补充: 如果我将其更改为:

onPress=this.onPress.bind('foo')

它也不起作用。

【问题讨论】:

顺便说一句,从技术上讲,bind 在这种情况下根本不需要,因为 this 没有在 onPress 函数中引用。 【参考方案1】:

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

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

    this.onPress = this.onPress.bind(this);
  

然后

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

【讨论】:

它消除了错误,但 'foo' 字符串会自动被控制台记录下来,我什至没有点击。 对不起,我已经更新了我的答案。您需要在 this.onPress('foo') 之前添加 () =>。 没有胖箭头函数,我们是在执行一个函数而不是给onPress一个函数,所以我们需要箭头函数来为onPress创建一个函数。 使用onPress=() =&gt; 时不需要绑定函数,因为它是自动完成的 使用粗箭头的原因如下:this.onPress.bind(this) 返回绑定函数,并将其传递给 onPress 属性。但是,不带粗箭头的this.onPress('foo') 将立即使用参数foo 调用函数onPress。由于这个函数没有明确返回任何东西,undefined 被返回,这就是传递给 onPress 属性的东西。但是,onPress 属性期望函数仅在用户单击后执行。 () =&gt; 使用 ES6 语法创建(并返回)一个函数。【参考方案2】:

您可以通过在 onPress 值处绑定函数并在“this”之后传递参数来避免在构造函数中绑定函数。你可以像这样重构你的代码,

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


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

更新:也可以使用闭包来做到这一点。

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

  onPress = (this, txt) => () => 
    console.log(txt);  // foo
  

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


【讨论】:

确实非常方便,因为胖箭头函数会触发重新渲染,因为 react 无法缓存它 eslint 不太喜欢这样:github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/… 这应该是首选答案,因为它避免了每次按下都创建一个新的匿名函数,因为评分最高的答案会这样做...... 不正确,this.onPress.bind(this, 'foo')still leads to re-render。所以这个方法和胖箭头函数的效果是一样的。 @FanchenBao 所以,你是怎么解决的?【参考方案3】:

你也可以用粗箭头解决它:

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

【讨论】:

此方法有效,但效率较低。每当您点击该变量时,都需要创建该函数,然后执行该函数。如果你使用函数定义,然后绑定,每当你点击时,函数只会被调用,而不是每次都创建。【参考方案4】:

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

onPress= ()=> this.handlePress(param)

【讨论】:

这是最简单直接的答案,谢谢!【参考方案5】:

定义函数并调用它 onPress of Text。如果你正在迭代数组,那么你也可以传递标题

  selectText = (item) => 
            console.log(item) // will print Text Pressed
            alert(item)
      
   return(
       <View>
       <Text onPress = ()=>this.selectText("Text Pressed")>Press for Alert</Text>
       </View>
    

【讨论】:

【参考方案6】:

试试这个

const onChangeHandler = index =>  console.log(index) 
onPress=onChangeHandler.bind(this, index)

【讨论】:

以上是关于react-native onPress 与参数绑定的主要内容,如果未能解决你的问题,请参考以下文章

如何在 react-native 的 onPress 按钮上滚动底部?

返回 JSX 组件 onPress react-native

如何在 react-native 中的 onPress 按钮上滚动顶部?

在 React-Native navigationOptions 中处理 OnPress

react-native TouchableHighlight 禁用 onPress 颜色闪烁

在 React-Native 中手动设置 opacity 的 onPress of TouchableOpacity 的音量