如何在此示例React组件中的消息映射中调用handleButtonPress
?
import React, { Component } from 'react';
import {View, Text, TouchableOpacity} from 'react-native';
export default class MyComponent extends Component {
constructor(props){
super(props)
this.state = {messages:["THANKS", "MERCI", "GRAZIE"]}
this.myFunc = this.myFunc.bind(this)
this.handleButtonPress = this.handleButtonPress.bind(this)
}
render(){
return (
<View>
<Text>{this.state.message}</Text>
{
this.state.messages.map(function(message, index){
return (
<TouchableOpacity key={index} onPress={function(){ this.handleButtonPress(message) }.bind(this) }>
<Text>Press Me</Text>
</TouchableOpacity>
)
})
}
</View>
)
}
handleButtonPress(message){
console.log("BUTTON WAS PRESSED WITH MESSAGE: " + message)
this.myFunc(message)
}
myFunc(message){
console.log("MY FUNCTION WAS CALLED")
this.setState({message:message})
}
}
现在它投掷:undefined is not a function (evaluating 'this.handleButtonPress(message)')
。为什么会这样?
答案 0 :(得分:6)
问题是Array.prototype.map
除非明确告知,否则不会绑定this
上下文。来自文档:
如果向
thisArg
提供了map
参数,则会在调用时将其传递给回调,以用作此值。否则,将传递值undefined
以用作此值。 1
由于您从未指定this
值,因此它为undefined
,因此绑定到this
中的匿名函数的onPress
为undefined
}。这会引发错误,因为handleButtonPress
没有函数undefined
。这意味着您需要将this
上下文传递给map
,并从文档中传递:
<强>语法强>
arr.map(callback[, thisArg])
这将适用于:
{
this.state.messages.map(function(message, index){
return (
<TouchableOpacity key={index} onPress={function(){ this.handleButtonPress(message) }.bind(this) }>
<Text>Press Me</Text>
</TouchableOpacity>
)
}, this) //Notice the `this` here, this is the optional thisArg which is used as the `this` value in the callback.
}
this
是传递给map
时的类。然后它将绑定到onPress
的事件处理程序(匿名函数),然后正确调用。 (注意:您可能应该在构造函数中绑定一次方法,因为如果您现在这样做,每次触发事件时都会创建一个新方法。)
1 实际上,如果没有thisArg
通过,this
值将照常确定。由于常规函数中的this
为严格模式window
(undefined
,这是类的默认模式),this
并不是您认为的。