Typescript Vue 3检测不到对在Vue组件外部创建的对象所做的更改
我有一个阶级性格:Typescript Vue 3检测不到对在Vue组件外部创建的对象所做的更改,typescript,vue.js,vuejs3,Typescript,Vue.js,Vuejs3,我有一个阶级性格: Character.ts /// This is called when server responds public setAttributeByType(type: StatsTypes, value: number): void { switch (type) { case StatsTypes.STRENGTH: case StatsTypes.DEXTERITY:
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组件外部创建的:
并用于主要部件:
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,
}
}
},
})
问题是,每当我在vue组件之外的character类实例中更改任何内容(在我的网络代码中)-例如character.setAttributeByType(attribute,value)
,vue都看不到更改。如果我直接在character.vue
组件中执行此操作,它会工作(请参阅addPoint
中的注释代码)
我尝试使用Proxy&Watch,但没有任何帮助。您的问题是“身份”问题
Vue 3使用ES6代理使对象具有反应性。如果执行const data=reactive(payload)
,则数据
与有效负载
是不同的对象(与Vue 2中仅使用reactive setters/getter修改对象不同)
同样适用于选项API(您正在使用)。如果在data()
中执行character:Player.character
,则结果是此.character
(在Vue组件内部)与Player.character
不同。您可以通过执行console.log(this.character==Player.character)
轻松测试它。例如,在mounted()
-结果将是false
因此,如果您使用this.character
(Vue被动代理)进行任何更改,Vue将检测到更改并重新渲染(并将更改传播到原始对象),但如果您更改原始对象Player.character
,则Vue不会检测到更改
简单的修复方法是使用Vue,它允许您在Vue组件之外使用Vue反应性
import{reactive}from`vue`
Player.character=reactive(新角色(data.data));
现在,当您在Vue组件中使用
Player.character
初始化data()
时,Vue会发现它已经是一个反应代理,不再将其包装在代理中向我们显示实例化类并“将其放入”Vue(父组件)中的代码。@MichalLevýProblém是代码没有在Vue组件中实例化。它在外部实例化,并且仅在vue组件Game.vue->character:Player.character(Player.character是对实例的引用)Game.vue中将角色绑定到character.vue中。实例是在收到数据包开始游戏时创建的,即在自定义处理程序中。@MichalLevý唯一的解决方法是更改VUe组件中的道具值。然后是工作或强制重新加载不好。但是类内部或Vue组件外部的更改没有注册,有没有办法在Vue组件外部查看这些更改?显示代码!它是如何“放置在vue组件游戏中的。vue”?@MichalLevý可能就足够了,或者如果您能给我发送PM,我可以在github中提供完整的代码
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,
}
}
},
})