Vuex 更改不影响模块

ken*_*ken 5 vue.js 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;
  }

}
Run Code Online (Sandbox Code Playgroud)

我从父组件调用 Vuexcommit('SHOW_USER_PROFILE', id)并因此设置此 ID,它应该相应地更新UserDialogshow属性。

在此处输入图片说明

我可以很清楚地看到 Vuex 商店收到了对 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]
});
Run Code Online (Sandbox Code Playgroud)

用户突变

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;
  }
};
Run Code Online (Sandbox Code Playgroud)

我在UserDialog上面的组件中添加了一个计算属性:

public get userId() {
  return this.$store.state.users.show;
}
Run Code Online (Sandbox Code Playgroud)

有人认为这可能是反应性的,而@Users.State装饰show属性则不是。不幸的是,它们的性能完全相同。

在此处输入图片说明

ken*_*ken 4

@Derek 和我昨晚交谈并意识到这个问题的原因是由于状态转换为“未定义”,当前的响应式系统无法处理(当我们使用对象代理到达 Vue-NEXT 时应该没问题)。undefined \xe2\x86\x92 string \xe2\x86\x92 undefined当我将状态转换从: 切换到 时,其余代码工作得很好null \xe2\x86\x92 string \xe2\x86\x92 undefined

\n\n

非常感谢@Derek 花时间。

\n