在React.js组件

时间:2017-05-19 14:01:36

标签: javascript reactjs websocket

我在React.js组件中使用websocket,并尝试在websocket的register事件中调用本地方法onopenconsole.log()在onopen事件中工作正常,但我的本地函数register不是。我越来越错误注册不是函数

这是代码

this.ws.onopen = function()
{
  console.log('Connected! now registering');
  this.register();
}

任何帮助!

1 个答案:

答案 0 :(得分:2)

那是因为this的价值正在发生变化。发生了什么事情是你正在为this.ws.onopen分配一个函数,然后Web套接字实例正在调用onopen,其中this指向Web套接字本身,而不是您的reactjs类实例。您需要保留对reactjs类实例的引用,并使用它来调用register方法:

this.ws.onopen = () =>
{
  console.log('Connected! now registering');
  this.register();
}

以上使用箭头功能(ECMA6功能)来保留它的值。这是有效的,因为箭头函数不允许其调用者(在本例中为Web套接字)更改其this的值。或者你可以这样做:

var self = this;
this.ws.onopen = function()
{
  console.log('Connected! now registering');
  self.register();
}

它只是在执行this的值更改的函数之前存储对reactjs对象的引用。或者你可以这样做:

this.ws.onopen = function()
{
  console.log('Connected! now registering');
  this.register();
}.bind(this)

,在为函数this.ws.onopen分配函数之前断言,无论函数调用的是谁或如何调用,函数的this值始终为传递给{{{ 1}}。