我该如何在React中解决“ _this is undefined”?

时间:2018-12-05 08:11:53

标签: reactjs react-native

正在按照本教程制作一个简单的待办事项应用程序(https://hackernoon.com/create-a-simple-todo-app-in-react-9bd29054566b)。

我遇到此错误:

TypeError: _this is undefined

参考以下组件中使用onClick删除的时间:

import React, {Component} from 'react'

class TodoItems extends Component {

    createTasks(item) {
        return (
            <li key={item.key} onClick={() => this.props.deleteItem(item.key)}>
                {item.text}
            </li>
        )
    }
    render() {
        const todoEntries = this.props.entries
        const listItems = todoEntries.map(this.createTasks)

        return <ul className="theList">{listItems}</ul>
    }
}

export default TodoItems

我已经看到我可能必须在构造函数中使用.bind(this),但我不太确定如何在此处应用它。

这是App.js的一段,其中定义了deleteItem并称为TodoItems:

    deleteItem = key => {
        const filteredItems = this.state.items.filter(item => {
            return item.key !== key
        })
        this.setState({
            items: filteredItems,
        })
    }
    inputElement = React.createRef()
    render() {
    return (
        <div className="App">
            <TodoList
                addItem={this.addItem}
                inputElement={this.inputElement}
                handleInput={this.handleInput}
                currentItem={this.state.currentItem}
            />
            <TodoItems entries={this.state.items} deleteItem={this.deleteItem}/>
        </div> //App
    )
  }

在此先感谢您的帮助!

4 个答案:

答案 0 :(得分:1)

如果你不知道为什么...

  

类声明和类表达式的主体以严格模式执行,即构造函数,静态方法和原型方法。 Getter和setter函数在严格模式下执行。

在React的类组件中,当我们将事件处理函数的引用作为回调传递时,

<button type="button" onClick={this.handleClick}>Click Me</button>

点击我 事件处理程序方法将失去其隐式绑定的上下文。当事件发生并调用处理程序时,此值将返回默认绑定,并设置为undefined,因为类声明和原型方法以严格模式运行。

当将事件处理程序的this绑定到构造函数中的组件实例时,我们可以将其作为回调传递,而不必担心会丢失其上下文。

箭头函数不受此行为的影响,因为它们使用词汇表this绑定,该绑定会自动将它们绑定到定义它们的作用域。

This is why we need to bind event handlers in Class Components in React

Class MDN

答案 1 :(得分:0)

this.createTasks方法用作回调。为了使用this,应该绑定到适当的上下文。

它应该是:

createTasks = (item) => {...}

createTasks = this.createTasks.bind(this);

createTasks(item) {...}

答案 2 :(得分:0)

constructor(){
  this.createTasks = this.createTasks.bind(this);
}

您可以使用具有正确Babel配置的ES6使其变得更简单,并省去constructor()周期。 遵循此tutorial.

答案 3 :(得分:0)

您可以使用粗箭头功能

deleteItem={()=>{this.deleteItem()}}

在ES6中支持。

OR

您也可以在构造函数中.bind(this)。

例如。

constructor(props){
    super(props);
    this.deleteItem = this.deleteItem.bind(this)
}