我不知道如何解决这个问题,因为它有很多内容,而且这种行为是我以前从未在 JavaScript 或 Vue.js 中看到过的。当然,我会尽量保持代码最小化批判和碎片
我正在使用 vue-class-component(6.3.2),所以我的 Vue(2.5.17) 组件看起来像类:) 这个特定组件看起来像这样:
import GameInterface from '@/GameInterface';
class GameComponent extends Vue {
public gameInterface = GameInterface();
public mounted() {
this.gameInterface.launch();
}
}
GameInterface 返回一个带有启动方法和其他游戏变量的对象。
在游戏接口文件中的方法看起来是这样的:
const GameInterface = function () {
const obj = {
gameState: {
players: {},
},
gameInitialized: false,
launch() => {
game = createMyGame(obj); // set gameInitialized to true
},
};
return obj;
}
export default GameInterface;
太好了,它起作用了,对象被传递到我的 Phaser 游戏:) 并且它也被方法返回,这意味着 Vue 现在可以使用这个对象。
在某些时候,我的 Vue 类中有一个 getter 方法,如下所示:
get currentPlayer() {
if (!this.gameInterface.gameInitialized) return null;
if (!this.gameInterface.gameState.players[this.user.id]) {
return null;
}
return this.gameInterface.gameState.players[this.user.id];
}
果然,即使玩家和 id 明显存在,也会返回 null 。当我 console.logthis.user.id
我得到4
,并gameInterface.gameState.players
为玩家返回一个带有 getter 的对象,如下所示:
{
4: { ... },
5: { ... },
}
好吧,所以即使对象和键被正确传递,它也不会返回玩家......
但是我发现了一种非常奇怪的方法来“修复”这个问题:通过JSON.parse(JSON.stringify(gameState))
像这样添加
get currentPlayer() {
// ...
if (!this.gameInterface.gameState.players[this.user.id]) {
// add this line
JSON.stringify(this.gameInterface.gameState);
return null;
}
return this.gameInterface.gameState.players[this.user.id];
}
它成功地为我们返回了当前玩家......奇怪吗?
我的猜测是,当我们这样做时,我们会“碰撞”对象,Vue 会因此而注意到一些变化并正确更新对象。有谁知道我在这里想念什么?