我有一个名为
从父组件中,我调用了Vuex的
UserDialog
的组件,它利用Vuex状态树的一部分来确定是否应该显示自己:import { Component, Prop, Vue } from 'vue-property-decorator';
import { State, Getter, Mutation, Action, namespace } from 'vuex-class';
import { fk } from 'firemodel';
import { User } from '@/models/User';
const Users = namespace('users');
@Component({})
export default class UserDialog extends Vue {
@Prop() public id!: fk;
@Users.State public show: fk;
@Users.Getter public selectedUser: User;
@Users.Mutation public HIDE_USER_PROFILE: () => void;
public get showDialog() {
return this.show === undefined ? false : true;
}
}
从父组件中,我调用了Vuex的
commit('SHOW_USER_PROFILE', id)
,从而设置了这个ID,它应该相应地更新UserDialog的show
属性。
我清晰地看到Vuex store已经接收到了SHOW_USER_PROFILE的调用,并且确实已经更新了状态树中的状态(这是通过浏览器中的Vue Developer插件完成的)。但是,当我切换到UserProfile组件时,我发现它仍然没有接收到状态更新。
注意:如果在设置要突出显示的UserID后重新加载页面(即CMD-R),它会重新加载组件,并且因为我正在使用veux-persist,ID仍然设置在状态树中。此时组件会收到正确的状态,但是在依赖于正常响应系统时,它就不起作用。
有人能帮忙吗?
为了提供更多背景信息,这里列出了几个相关的模块:
商店定义::
export default new Vuex.Store<IRootState>({
modules: {
packages,
users,
searchCriteria,
snackbar
},
plugins: [FireModelPlugin, localStorage.plugin]
});
用户突变:
const mutations: MutationTree<IUsers> = {
selectUser(state, id: fk) {
state.selected = id;
},
SHOW_USER_PROFILE(state, id: fk) {
state.show = id;
},
HIDE_USER_PROFILE(state) {
state.show = undefined;
}
};
我已经在上面的UserDialog
组件中添加了一个计算属性:
public get userId() {
return this.$store.state.users.show;
}
有一种想法认为,也许这将是反应性的,而@Users.State
装饰的show
属性却不是。不幸的是,它们都执行完全相同。
computed
属性来响应式地获取 Vuex 状态。 - Derek Pollardvuex-class
定义时,你会在类上获得一个响应式属性,但这可能是错误的。如果不是这种情况,我认为Getter
装饰器有点危险。 - kenthis.show
而非 getter。 - Derek Pollard