开发者问题收集

React 中函数未定义错误

2017-11-30
3502

我试图从 componentDidMount 调用一个函数来设置 State,但一直遇到错误

Uncaught ReferenceError: setPanelState 未定义

下面是代码...

export default class Patient extends React.Component {
  constructor(props) {
    super(props);
    autoBind(this);

    this.state = {
     PATIENT: [],
     COMPPROPS: [],
    };

    this.setPanelState = this.setPanelState.bind(this);
  }

    setPanelState(activity) {
          this.setState({COMPPROPS: [{compName:'Overview', compState:'Edit'}]});
    }

    componentDidMount() {   
       //handles chat commands and if the command is update patient the Overview panel should change to editable
       this.directLine.activity$
        .filter(function (activity) {
          return activity.type === 'event' && activity.value === 'Update Patient';
       })
       .subscribe(function (activity) {
         setPanelState(activity);   
       })
  }

我曾尝试将 setPanelState 设为类外的函数而不是方法,但同样出现错误。

有什么想法吗?

3个回答

由于您使用的是 ES6 类,我假设您已全部设置完毕。

使用自动绑定 this 的箭头函数

要了解有关箭头函数的更多信息,请参阅 this

.subscribe((activity) => {
    this.setPanelState(activity);   
})

您的组件将如下所示:

 export default class Patient extends React.Component {
  constructor(props) {
    super(props);
    autoBind(this);

    this.state = {
     PATIENT: [],
     COMPPROPS: [],
    };

    this.setPanelState = this.setPanelState.bind(this);
  }

    setPanelState(activity) {
          this.setState({COMPPROPS: [{compName:'Overview', compState:'Edit'}]});
    }

    componentDidMount() {   
       //handles chat commands and if the command is update patient the Overview panel should change to editable
       this.directLine.activity$
        .filter((activity) => {
          return activity.type === 'event' && activity.value === 'Update Patient';
       })
       .subscribe((activity) => {
         this.setPanelState(activity);   
       })
  }
João Cunha
2017-11-30

使用 this.setPanelState(activity) 并记得维护上下文。由于您不是 ES6 箭头函数。保存 var that=this 外部的上下文并访问内部的变量

simbathesailor
2017-11-30

在您的 componentDidMount 方法中使用 this.setPanelState 调用 setPanelState >

您还可以使用更好的格式:

.subscribe(this.setPanelState)

如果您将 setPanelState 放在类之外并调用它,它将不起作用, 除非它在另一个可以使用 setState 的类中定义。

ismnoiet
2017-11-30