我在React.js组件中使用websocket,并尝试在websocket的register
事件中调用本地方法onopen
。 console.log()
在onopen事件中工作正常,但我的本地函数register
不是。我越来越错误注册不是函数。
这是代码
this.ws.onopen = function()
{
console.log('Connected! now registering');
this.register();
}
任何帮助!
答案 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}}。