【发布时间】:2020-04-10 16:49:47
【问题描述】:
我想知道在客户端 (React) 和服务器 (Express + Socket.IO) 之间共享相同数据类型的最佳方式是什么。
在我的游戏中,我有不同的房间,每个房间都会保存当前状态,例如:
class GameRoom {
players: Player[];
started: boolean;
currentPlayerTurn; Player;
dices: [number, number];
constructor({players = [], started = false, currentPlayerTurn = null, dices = [1,1]) {
this.players = players;
this.started = started;
this.currentPlayerTurn = currentPlayerTurn;
this.dices = dices;
}
startGame() {
this.currentPlayerTurn = this.players[0];
this.started = true;
}
// etc..
}
房间正在服务器中生成,以 JSON 格式发送到客户端,然后在客户端中重建。我将数据与套接字事件同步,一切都很完美。
但故事的 React 方面存在问题:更改 GameRoom 属性不会导致重新渲染。这意味着每次编辑某些内容或收听课程更改时,我都必须forceRerender()。这两个选项都是一团糟,我described it deeply in this question。
这个烂摊子让我觉得上课可能不是最好的方式。使用接口将完全解决这个问题,但我确实丢失了像 GameRoom.startGame() 这样的实例函数,必须将其转换为实用函数,比如:
export function startGame(gameRoom: GameRoom) {
gameRoom.currentPlayerTurn = gameRoom.players[0];
gameRoom.started = true;
}
这又是一团糟,因为它们隐藏在代码中,开发人员需要知道它们存在,而不是直接编辑gameRoom。
如果你们对如何为我的数据类型建模有任何想法,我会非常乐意听到。
谢谢!
【问题讨论】:
标签: javascript reactjs typescript express