您的套接字响应是基于回调的。所以有两种方法可以解决这个问题。要么承诺你的回调,要么从组件传入一个回调(函数),该组件将使用新数据设置状态。我将解释下面的两种方法
承诺方法
SocketIOClient.js
import io from 'socket.io-client'
const socket = io.connect(`${process.env.REACT_APP_SERVER_URL}`)
export const studentFunction = (studentID) => {
return new Promise((resolve) => {
socket.on('returnedStudentDetails', data => {
resolve(data);
});
socket.emit('getStudentDetails', { studentID });
});
};
容器.js
import { studentFunction } from 'SocketIOClient';
export default class Container extends Component {
constructor(props) {
super(props);
this.state = {
studentDetails: '',
}
}
componentDidMount() {
const studentDetails = await studentFunction(1);
this.setState({ studentDetails });
}
render() {
const { studentDetails } = this.state;
return (
<div>{studentDetails}</div>
);
}
}
回调方法
SocketIOClient.js
import io from 'socket.io-client'
const socket = io.connect(`${process.env.REACT_APP_SERVER_URL}`)
export const studentFunction = (studentID, callback) => {
socket.emit('getStudentDetails', { studentID })
socket.on('returnedStudentDetails', callback)
}
容器.js
import { studentFunction } from 'SocketIOClient';
export default class Container extends Component {
constructor(props) {
super(props);
this.state = {
studentDetails: '',
}
studentFunction(1, this.onLoadStudentData);
}
onLoadStudentData = (studentDetails) => this.setState({ studentDetails })
render() {
const { studentDetails } = this.state;
return (
<div>{studentDetails}</div>
);
}
}