ここに主な問題があります: 私は最初のメッセージでsessionIdを読む必要があるwebsocketを開きます。したがって、これは1回だけ行う必要があります。 (すべてを投稿didntは)親状態の変更時に反応しない子プロップは更新されません
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import ChatBot from 'react-simple-chatbot';
export class ProcessMessage extends Component {
constructor(props) {
super(props);
this.state = {
messages: [],
};
}
componentWillMount() {
const input = {
type: 'user',
sessionId: this.props.sessionId,
msg: this.props.inputMessage,
};
//send message to websocket
this.props.connection.send(input)
this.props.connection.onmessage = evt => {
// add the new message to state
const msg = JSON.parse(evt.data);
let responseText = msg.msg;
this.setState({
messages : responseText
})
};
}
render() {
return <div>{ this.state.messages}</div>;
}
}
とのWebSocketを開き、このようになりますセッションIDのコンポーネントを取得「アプリ」親:
私は、子コンポーネント次のようになります「processMessage」を持っている
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { ProcessMessage } from './components/processMessage.js';
export class App extends React.Component {
constructor(props) {
super(props);
// Assign state itself, and a default value for items
}
componentWillMount() {
const url = 'ws://localhost:4040';
// this open websocket service
this.connection = new WebSocket(url);
this.setState(
{ connection:this.connection }
);
var sessionId;
// listen to onmessage event
this.connection.onmessage = evt => {
// add the new message to state
const msg = JSON.parse(evt.data);
if (msg.type = "sessionId") {
sessionId=msg.msg;
console.log("now received sessionId " +sessionId);
this.setState(
{ sessionId: sessionId}
);
}
};
}
render(){
return <ProcessMessage sessionId={this.state.sessionId} connection={this.state.connection} inputMessage={this.state.inputMessage}/>
}
だから何が働いているメッセージが正しく接続小道具(ソケットオープン)に送られたが、それは私が取得する場所ソケットの最初の応答を受信するためにいくつかの時間がかかるため、セッションIDは、子コンポーネントで定義されていないされていることですsessionIdしかし、コンポーネント新しい小道具で再現されていないようです。
私はまた、子コンポーネントprocessMessageに入れてみてください:
componentWillReceiveProps(nextProps) {
this.setState({ sessionId: nextProps.sessionId});
}
成功しません。私は明白な何かを欠いていますか
それでもcomponentDidMountを更新していません()。私は正しくコンソールでsessionIdを受け取りましたが、未定義の結果として子コンポーネントにconsole.log(this.props.sessionId)があるため、setStateが機能しないようです... – mehdio
問題は、processMessageが実際に問題を引き起こしたが、解決策は実際には正しいものでした! – mehdio
問題を解決できたらうれしいです –