2017-07-28 75 views
0

我使用的反應,WebSocket的測試通信裏面:如何調用與綁定方法(這)一個WebSocket的事件

class Class extends React.Component { 

    constructor(props) { 
    super(props); 
    this.state = {...}; 
    this.generateMsg= this.generateMsg.bind(this); 
    this.sendMsg = this.sendMsg.bind(this); 
    } 

    //generate a random array 
    generateMsg(n) {return [...]} 

    //websocket sendMsg 
    sendMsg(){ 
    const wsClient = new Websocket(url); 
    wsClient.onopen = function(){ 
     wsClient.send(this.generateMsg(40)); 
    } 
    } 

    render() { 
    return (
     <button onClick={this.sendMsg}>{this.state.nameList}</button> 
    ); 
    } 
} 

ReactDOM.render(...); 

總是引發ERR「this.generateMsg不是一個函數」,如何調用方法綁定(這)在一個websocket事件內請嗎?

+0

誰在調用'sendMsg()'?如果啓用了babel ['transform-class-properties'](https://babeljs.io/docs/plugins/transform-class-properties/),請嘗試使用箭頭函數將sendMsg定義爲類屬性。 –

+0

對不起,爲了清楚問題,我隱藏了其他部分,我現在修改我的問題 –

+0

這段代碼沒有什麼不對。您需要提供更多信息。 –

回答

1

使用箭頭功能是這樣的:

wsClient.onopen =() => { 
     wsClient.send(this.generateMsg(40)); 
    } 
0

爲什麼你創建的每SENDMSG調用新的WebSocket連接?您可以在componentDidMount上打開連接並存儲它。

class Class extends React.Component { 
    constructor(props) { 
    super(props); 
    this.state = {...}; 
    this.generateMsg = this.generateMsg.bind(this); 
    this.sendMsg = this.sendMsg.bind(this); 
    } 

    // open connection on mount 
    componentDidMount() { 
    this.socket = new WebSocket(url); 
    } 

    //generate a random array 
    generateMsg(n) {return [...]} 

    //websocket sendMsg 
    sendMsg() { 
    this.socket.send(this.generateMsg(40)); 
    } 

    render() { 
    return (
     <button onClick={this.sendMsg}>{this.state.nameList}</button> 
    ); 
    } 
} 
+0

說實話,我不知道,我仍然試圖弄清楚這裏的生命週期,因爲我的代碼無限地發送消息給ws服務器。我想也許你的建議正是我需要考慮的。 –

相關問題