You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React类组件报错:Cannot read properties of undefined (reading 'onDismiss')求助

React中Uncaught TypeError: Cannot read properties of undefined (reading 'onDismiss')错误解决

跟着《Road to Learn React》教程实现列表项删除功能时,点击Dismiss按钮出现Uncaught TypeError: Cannot read properties of undefined (reading 'onDismiss')错误,且列表无法正确更新。以下是你的原代码:

import React, {Component} from 'react';
import logo from './logo.svg';
import './App.css';

const lst = [
  {
    title: 'React',
    url: 'http://reactjs.org',
    author: 'Jordan Walke',
    num_comments: 3,
    points: 4,
    objectID: 0,
  },
  {
    title: 'Redux',
    url: 'http://redux.js.org',
    author: 'Dan Abramov, Andrew Clark',
    num_comments: 2,
    points: 5,
    objectID: 1,
  },
]

class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      lst: lst,
    };
    this.onDismiss = this.onDismiss.bind(this);
  }

  onDismiss(id){
    function isNotId(item){
      return item.objectId !== id;
    }
    const updatedList = this.state.lst.filter(isNotId);
    this.setState({ lst: updatedList });
  }

  render() {
    const msg = "Learn React Now"
    return (
      <div className="App">
        <header className="App-header">
          <img src={logo} className="App-logo" alt="logo" />
          <a
            className="App-link"
            href="https://reactjs.org"
            target="_blank"
            rel="noopener noreferrer"
          >
            {msg}
          </a>

          {
            this.state.lst.map(function(item){
              return (
                <div key={item.objectID}>
                  <span>
                    <a href={item.url}>{item.title}</a>
                  </span>
                  <span>; {item.author}</span>
                  <span>; {item.num_comments}</span>
                  <span>; {item.points}</span>
                  <span>
                    <button 
                      onClick={() => this.onDismiss(item.objectID)} 
                      type='button'
                    >
                      Dismiss
                    </button>
                  </span>
                </div>
              )
            })
          }
        </header>
      </div>
    );
  }
}

export default App;

错误原因及修复:

1. map函数中this指向错误

你在this.state.lst.map里使用了普通function(item)回调,该函数内部的this并不指向组件实例(严格模式下为undefined),导致点击按钮时调用this.onDismiss触发报错。

修复:将map的回调改为箭头函数,箭头函数会继承外部作用域的this指向:

this.state.lst.map((item) => {
  // 原返回内容不变
})

2. 属性名大小写不匹配

onDismiss方法里的isNotId函数中,判断条件写的是item.objectId,但数据源中的属性是objectID(大写D),这会导致过滤逻辑永远为true,删除操作无法生效。

修复:将item.objectId改为item.objectID:

function isNotId(item){
  return item.objectID !== id;
}

修复后的完整代码:

import React, {Component} from 'react';
import logo from './logo.svg';
import './App.css';

const lst = [
  {
    title: 'React',
    url: 'http://reactjs.org',
    author: 'Jordan Walke',
    num_comments: 3,
    points: 4,
    objectID: 0,
  },
  {
    title: 'Redux',
    url: 'http://redux.js.org',
    author: 'Dan Abramov, Andrew Clark',
    num_comments: 2,
    points: 5,
    objectID: 1,
  },
]

class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      lst: lst,
    };
    this.onDismiss = this.onDismiss.bind(this);
  }

  onDismiss(id){
    function isNotId(item){
      return item.objectID !== id;
    }
    const updatedList = this.state.lst.filter(isNotId);
    this.setState({ lst: updatedList });
  }

  render() {
    const msg = "Learn React Now"
    return (
      <div className="App">
        <header className="App-header">
          <img src={logo} className="App-logo" alt="logo" />
          <a
            className="App-link"
            href="https://reactjs.org"
            target="_blank"
            rel="noopener noreferrer"
          >
            {msg}
          </a>

          {
            this.state.lst.map((item) => {
              return (
                <div key={item.objectID}>
                  <span>
                    <a href={item.url}>{item.title}</a>
                  </span>
                  <span>; {item.author}</span>
                  <span>; {item.num_comments}</span>
                  <span>; {item.points}</span>
                  <span>
                    <button 
                      onClick={() => this.onDismiss(item.objectID)} 
                      type='button'
                    >
                      Dismiss
                    </button>
                  </span>
                </div>
              )
            })
          }
        </header>
      </div>
    );
  }
}

export default App;

内容的提问来源于stack exchange,提问作者lowdragonfly8

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 00:53:14