javascript - 有人知道如何修复此错误 : Can't call setState (or forceUpdate) on an unmounted component. ...?

标签 javascript reactjs

我收到错误:无法在未安装的组件上调用 setState(或forceUpdate)。这是一个空操作,但它表明应用程序中存在内存泄漏。有谁知道我应该如何在 click 函数中 setState 以避免此错误?谢谢

class List extends Component {
  constructor(props) {
    super(props);
    this.state = {
      showMenu: null
   };
}

showMenu = (id) => {
    this.setState(prevState => ({
      showMenu: prevState.showMenu===null ? id : null,
    }))
}

componentDidMount(){
    document.addEventListener('click', (e)=>this.click(e))
}

componentWillUnmount() {
    document.removeEventListener('click', (e)=>this.click(e))
}


click = (e) => {
    if(e.target.className!=='flaticon-menu white'){
      this.setState({
        showMenu:null
      })
    }
}

最佳答案

您的removeEventListener不起作用。两个看似相同的箭头函数实际上并不相同:

 (e => this.click(e)) === (e => this.click(e)) // false

因此,您必须存储监听器以便随后将其删除:

 componentDidMount(){
   this.listener = e => this.click(e);
   document.addEventListener('click', this.listener);
}

componentWillUnmount() {
   document.removeEventListener('click', this.listener);
}

或者你直接使用this.click:

componentDidMount(){
   document.addEventListener('click', this.click);
}

componentWillUnmount() {
   document.removeEventListener('click', this.click);
}

关于javascript - 有人知道如何修复此错误 : Can't call setState (or forceUpdate) on an unmounted component. ...?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52677063/

相关文章:

javascript - react : Instantiate component once and use multiple times

javascript - 如何拆分模板文字?

reactjs - 在 React 中使用 setState 更新对象

javascript - 访问另一台 LAN PC 上的 Webpack Dev Server

javascript - Cordova 文件传输插件下载总是产生 http 状态 401 和错误代码 3

javascript - 执行 JQuery 隐藏/显示 DIV 层后是否可以定位 HTML elementID?

javascript - AngularJS $scope 变量无缘无故改变值?

javascript - 为通用事件处理程序提供参数

javascript - 如何在没有/g的情况下替换JavaScript中字符串中的所有句点?

javascript - 我正在使用react-image-crop与react和Express来使用Crop上传个人资料图片