setState未定义

时间:2019-04-02 10:18:37

标签: reactjs

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

  

未捕获的ReferenceError:未定义setState

我使用箭头函数将函数绑定到当前上下文。

  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
          }
        }
      }
    });
  };

5 个答案:

答案 0 :(得分:1)

尝试一下。

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 });
      }
    }
  }
});
};

答案 1 :(得分:1)

我不确定您要在此实现什么,但是vals <- df$x[cumsum(c(1,vec))][-1] df$y <- NA df$y[cumsum(c(1, vec + 1))] <- vals 冻结该应用。除非有人单击打印屏幕,否则不会运行任何代码。我的工作就像df <- data.frame(x = c(6211, 6111, 711, 414,3211,3311, 3411,3511,6211,6111)) vec <- as.numeric(c("2","4","2")) 。您可以尝试在window.print()之后打印一个thimestamp来尝试。因此,除了存在无法解决的上下文问题之外,整个功能是无用的。因为您可以这样做:

window.alert("...")

致谢

答案 2 :(得分:0)

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

return {
  isPrinting: false,
};

答案 3 :(得分:0)

这应该有帮助

  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方法应返回新状态,而不是尝试执行任何操作。

答案 4 :(得分:-1)

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