React.js - 传递函数“不是函数”错误

IT技术 javascript reactjs
2021-03-26 15:10:54

我试图将props从子组件传递给父组件,但由于某种原因,在单击呈现的子组件后,我在 js 控制台中收到错误“TypeError: this.props.onClick is not a function”。

基本上我想要做的是管理一个类别列表,其中一个类别子组件的“selected”属性为真,并且每次单击类别 li 时都会正确更新。

这是一个带有代码的 jsfiddle:http : //jsfiddle.net/kb3gN/8023/

我真的不觉得我已经掌握了如何有效使用 React.js 的概念,所以感谢任何帮助!

最好的问候和提前致谢,

布努纳马克

代码:

var CategoryList = React.createClass({

getInitialState:function(){
    return {
        items:[
            ["cat1", false],
            ["cat2", true]
        ],
        lastToggled:["cat2"]
    }
},

//Function passed to child (changes items state)
handleClick:function(child){
    var tempItems = this.state.items;
    if(this.state.lastToggled[0] === child.props.name){
        var index = this.getInd(this.state.tempItems, child.props.name);
        tempItems[index][1] = !tempItems[index][1];

        this.setState({items: tempItems});
    }else{
        var newIndex = this.getInd(this.state.tempItems, child.props.name);
        tempItems[newIndex][1] = !tempItems[newIndex][1];

        var oldIndex = this.getInd(this.state.tempItems, this.state.lastToggled[0]);
        tempItems[oldIndex][1] = false;

        this.setState({items: tempItems, lastToggled: tempItems[newIndex][0]});

    }
},

//getInd not relevant to problem
getInd:function(arr, elname){
    for (var i = arr.length - 1; i >= 0; i--) {
        if(arr[i][0] === elname){
            return i;
        }
    };
    return -1;
},

render:function(){
    return (<ul className="category-list">
        {
            this.state.items.map(function(item){
                return <Category onClick={this.handleClick} name={item[0]} selected={item[1]} />;
            })
        }
        </ul>)
}

});


var Category = React.createClass({

render:function(){
    if(this.props.selected){
        return (<li onClick={this.propogateClick} className="selected">{this.props.name}</li>);
    }else{
        return (<li onClick={this.propogateClick}>{this.props.name}</li>);
    }
},

propogateClick: function(){
    this.props.onClick(this);
}

});


React.renderComponent(<CategoryList/>, document.getElementById('example'));
2个回答

你可以使用bind来解决这个问题

this.state.items.map(function(item){
     return <Category onClick={this.handleClick} name={item[0]} selected={item[1]} />;
}.bind(this))

显然这是一个范围问题:

this.state.items.map(function(item){
            return <Category onClick={this.handleClick} name={item[0]} selected={item[1]} />;
        })

如果我删除外部地图并添加一个通用类别它就可以工作(好吧,还有其他问题,但点击功能成功通过)。

我将不得不以另一种方式传递该函数(不使用 this.handleClick)。