Reactjs 未定义设置状态

Reactjs 未定义设置状态,reactjs,Reactjs,我有一个打印功能,它首先将isPrinting的状态设置为true,然后打开一个spring对话框。关闭对话框后,它将isPrinting的状态设置为false,此时我得到了错误(第二个setState): 未捕获引用错误:未定义setState 我用arrow函数将函数绑定到当前上下文 handlePrint = () => { this.setState({ isPrinting: true }, () => { //setState is working worki

我有一个打印功能,它首先将
isPrinting
的状态设置为true,然后打开一个spring对话框。关闭对话框后,它将
isPrinting
的状态设置为
false
,此时我得到了错误(第二个
setState
):

未捕获引用错误:未定义setState

我用arrow函数将函数绑定到当前上下文

  handlePrint = () => {
    this.setState({ isPrinting: true }, () => { //setState is working working properly
      window.print();
      if (window.matchMedia) {
        var mediaQueryList = window.matchMedia('print');
        mediaQueryList.addListener = (mql) => {
          if (!mql.matches) {
            this.setState({ isPrinting: false }); //Error
          }
        }
      }
    });
  };

您是如何使用函数“mediaQueryList.addListener”的?您可以控制台这两个“this”,看看它们是否相同。

试试这个

handlePrint = () => {
let _this = this;
this.setState({ isPrinting: true }, () => {
  window.print();
  if (window.matchMedia) {
    var mediaQueryList = window.matchMedia('print');
    mediaQueryList.addListener = (mql) => {
      if (!mql.matches) {
        _this.setState({ isPrinting: false });
      }
    }
  }
});
};

第二次,只需返回新状态,而不是
setState
,如下所示:

return {
  isPrinting: false,
};
这应该会有所帮助

  handlePrint = () => {
    this.setState({ isPrinting: true }, () => { //setState is working working properly
      window.print();
      if (window.matchMedia) {
        var mediaQueryList = window.matchMedia('print');
        mediaQueryList.addListener = (mql) => {
          if (!mql.matches) {
            return { isPrinting: false };
          }
        }
      }
    });
  };

setState
方法应该返回一个新的状态,而不是尝试执行任何操作。

我不确定您在这里试图实现什么,但是
窗口.print()
会冻结应用程序。除非有人点击打印屏幕,否则不会运行任何代码。我的工作方式就像
window.alert(“…”)
。您可以在
win.print
之后立即打印一个thimestamp来尝试。所以,除此之外,这个上下文还有一个无法实现的问题,整个函数是无用的。因为你可以做到:

  handlePrint = () => {
    this.setState({ isPrinting: true }, () => {
      window.print() //freezes until someone clicks it away.
      this.setState({ isPrinting: false }) //Error
    })
  }

关于

您是否可以提供整个组件?您是否在类内定义了
handlePrint
函数?@VikashSingh是,
导出默认类SearchResultsPanel扩展组件{
此答案解释了为什么在mediaQueryList.addListener的回调中未定义setState。请尝试prabu samvel的答案以获得apt解决方案。谢谢,我不再收到错误,但状态不会更新为
false