在React.js中映射时引用prop的问题

时间:2016-01-26 23:54:57

标签: javascript reactjs

所以我的问题是我收到了这个错误:

  

未捕获的TypeError:无法读取属性' removeCard'未定义的

从这段代码:

var SurveyDiv = React.createClass({
getInitialState: function() {
    return{
        showCard: true
    };
},    
render: function() {
    console.log(this.props.routes);
    var routesObject = this.props.routes;
    var itemSurvey = this.state.showCard ? this.props.questions.map(function (itemSurvey) {  
        return(
            <Card
            id ={itemSurvey.surveyID}
            title={itemSurvey.title}
            options={itemSurvey.options}
            type={itemSurvey.type}
            routes={routesObject}
            removeHandler={this.removeCard}>
            </Card>
        );
        }) : '';
    return(
    <div className="surveyDiv">
        {itemSurvey}
    </div>
    );
},
removeCard: function() {
    console.log("inside removeCard");
    this.setState({showCard: false});
}
});

所以我的理论是,当我说这个时,它内部的删除卡引用了var itemSurvey而不是SurveyDiv,它实际上包含了removeCard函数。我怎么能绕过这个?

2 个答案:

答案 0 :(得分:1)

当您在函数内使用this.removeCard时,您引用的this函数不是SurveyDiv

你可以通过以下两种方式解决这个问题:

var removeCard = this.removeCard;
var itemSurvey = this.state.showCard ? this.props.questions.map(function (itemSurvey) {  
    return(
        <Card
            id ={itemSurvey.surveyID}
            title={itemSurvey.title}
            options={itemSurvey.options}
            type={itemSurvey.type}
            routes={routesObject}
            removeHandler={removeCard}>
        </Card>
    );
}) : '';

或者使用bind来更改地图功能中的this

var itemSurvey = this.state.showCard ? this.props.questions.map(function (itemSurvey) {  
    return(
        <Card
            id ={itemSurvey.surveyID}
            title={itemSurvey.title}
            options={itemSurvey.options}
            type={itemSurvey.type}
            routes={routesObject}
            removeHandler={this.removeCard}>
        </Card>
    );
}).bind(this) : '';

答案 1 :(得分:0)

您应该可以在地图外宣布它并将其传入。

// in render()
var removeCard = this.removeCard.bind(this);

  // inside <Card
    removeHandler: {removeCard}