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

xxe27gdn  于 2023-04-29  发布在  React
关注(0)|答案(5)|浏览(153)

我正在按照这个教程制作一个简单的todo应用程序(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

我看到我可能要用。在构造函数中绑定(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
    )
  }

提前感谢任何帮助!

f45qwnt8

f45qwnt81#

如果你不知道为什么。..
类声明和类表达式的主体以严格模式执行,即构造函数、静态和原型方法。Getter和setter函数在严格模式下执行。
在React中的类组件中,当我们像这样将事件处理函数引用作为回调传递时

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

单击“我”,事件处理程序方法将丢失其隐式绑定的上下文。当事件发生并调用处理程序时,this值福尔斯退到默认绑定并设置为undefined,因为类声明和原型方法以严格模式运行。
当我们将事件处理程序的this绑定到构造函数中的组件示例时,我们可以将其作为回调传递,而不用担心它会丢失上下文。
箭头函数不受此行为的影响,因为它们使用词法this绑定,自动将它们绑定到定义它们的范围。
This is why we need to bind event handlers in Class Components in React
Class MDN

ux6nzvsh

ux6nzvsh2#

您可以使用胖箭头功能

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

支持ES6。

你也可以。在构造函数中绑定(this)。

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

qgelzfjb3#

this.createTasks方法用作回调。它应该绑定到适当的上下文,以便使用this
它应该是:

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

或者

createTasks = this.createTasks.bind(this);

createTasks(item) {...}
ki1q1bka

ki1q1bka4#

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

您可以使用ES6,通过适当的Babel配置使其更简单,并消除对constructor()周期的需求。遵循此tutorial.

0lvr5msh

0lvr5msh5#

这里的文档是为那些可能像我一样使用Redux的人准备的,他们通过引用this错误地设置了一个reducer字段。像这样的-

case UPDATE_CURR_PAGE:
    return {
      ...state,
      currPg: this.action.payload
    }

this.action.payload中的this是我的罪魁祸首。容易错过和模糊的调试。

相关问题