map中的匿名函数内部的方法是未定义的

时间:2016-10-17 00:31:48

标签: javascript reactjs react-native es6-class

如何在此示例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)')。为什么会这样?

1 个答案:

答案 0 :(得分:6)

问题是Array.prototype.map除非明确告知,否则不会绑定this上下文。来自文档:

  

如果向thisArg提供了map参数,则会在调用时将其传递给回调,以用作此值。否则,将传递值undefined以用作此值。 1

由于您从未指定this值,因此它为undefined,因此绑定到this中的匿名函数的onPressundefined }。这会引发错误,因为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为严格模式windowundefined,这是类的默认模式),this并不是您认为的。