【发布时间】:2021-06-28 21:59:36
【问题描述】:
我有一个班级 Character :
Character.ts
/// This is called when server responds
public setAttributeByType(type: StatsTypes, value: number): void {
switch (type) {
case StatsTypes.STRENGTH:
case StatsTypes.DEXTERITY:
case StatsTypes.VITALITY:
case StatsTypes.INTELIGENCE:
this.stats[type] = value;
break;
default: break;
}
}
....
类实例是在我的“网络代码”中的 Vue 组件之外创建的:
public static onStartGame(data:any):void {
Player.character = new Character(data.data);
Game.displayGamePage(PagesIndex.GAME_PAGE);
requestAnimationFrame(Game.loop);
}
并用于主要组件:
Game.vue
import { defineComponent } from 'vue'
import Player from '@/Player/player';
import SceneManager, { Scenes } from '@/Render/scene_manager';
import Scene from '@/Render/scene';
import MainScene from "@/Render/scenes/main";
import MapScene from "@/Render/scenes/map";
import Game from '@/game/game';
// Components
import VplayerBar from "@/vue/subs/playerBar.vue"
import Vcharacter from "@/vue/subs/character.vue"
export enum GamePages {
MAIN_PAGE = 1,
MAP_PAGE,
}
export default defineComponent({
name: "game",
components: {
VplayerBar,
Vcharacter,
},
data() {
return {
page: GamePages.MAIN_PAGE,
scenes: Scenes,
gamePages: GamePages,
player: Player,
character: Player.character, /* <------------ Reference to class */
pages: {
character: false,
}
}
},
})
...将其作为道具传递给character.vue 组件
export default defineComponent({
name: "character",
props: {
character: { // <---- This prop does not change
type: Character,
required: true
},
toggleCharacter: {
type: Function,
required: true
}
},
components: {
VBackpack,
VInventory
},
data() {
return {
StatsTypes,
}
},
methods: {
toglePage() {
this.toggleCharacter()
},
getPortrait(isMobile:boolean = false) {
return Character.getCharacterPortrait(this.character.faction, this.character.gender, isMobile);
},
addPoint(attribute:StatsTypes, value: number) {
if (GKeyHandler.keys[Keys.SHIFT_LEFT])
value = 10;
CharacterHandler.addAttributePoint(Player.character, attribute, value);
//this.character.stats[StatsTypes.STRENGTH] += 1;
}
}
});
问题是,每当我在 vue 组件之外(在我的网络代码中)更改字符类实例中的任何内容时(例如 character.setAttributeByType(attribute, value)),Vue 都看不到更改。如果我直接在character.vue 组件中执行此操作,它可以工作(请参阅addPoint 中的注释代码)
我尝试使用 Proxy & Watch,但没有帮助。
【问题讨论】:
-
向我们展示您实例化类的代码并将其“放入”Vue(父组件)。
-
@MichalLevý 问题是代码没有在 Vue 组件中实例化。它是在外部实例化的,只有对这个实例的引用放在 vue 组件 Game.vue -> character: Player.character,(Player.character 是对实例的引用)Game.vue 将角色绑定到 character.vue。实例在收到数据包开始游戏时创建,即在自定义处理程序中。
-
@MichalLevý 唯一的解决方法是更改 VUe 组件内的 prop 值。然后它正在工作或强制重新渲染,这是不好的。但是 Vue 组件内部或外部的变化没有注册,有没有办法在 Vue 组件外部观察这些变化?
-
显示代码!它是如何“放置在vue组件Game.vue中”的?
-
@MichalLevý 可能就够了,或者我可以在 github 中提供完整的代码,如果你发给我的话
标签: typescript vue.js vuejs3