要在mapGetters上发出事件的组件

时间:2017-12-27 12:10:51

标签: vue.js vuex

所以我加载了我的组件,然后我调用了类似下面的内容:

created() {
  this.$store.dispatch('messages/connect');
  this.$store.dispatch('messages/fetchAllMessages');
  // this.$emit('set-recipient', this.chats[0]);
},

computed: mapGetters('messages', {
  chats: 'getMessages'
}),

已创建的评论部分是我想要运行的代码段,但仅限于this.chats的创建,而不是之后的任何更新。

如果我尝试发出当前的事件,我会收到错误:Cannot read property '0' of null

希望你理解我的意思。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

fetchallMessages调用您的服务器来获取消息,对吗?当meit像这样运行时,异步过程不会被冻结。

如果您确保从添加了chats后解决的该操作返回Promise,则可以执行以下操作:

this.$store.dispatch('messages/fetchAllMessages')
  .then(() => {
    this.$emit('set-recipient', this.chats[0]);
  })

如果从该操作返回Promise时遇到问题,请分享其实现,我们将对其进行修复。

答案 1 :(得分:0)

如果我理解正确,您只想在this.$emit('set-recipient', this.chats[0]);初始化后执行chats

您有两个选择:

  1. 不要将mapGetters用于聊天getter,只需自己定义计算:

    computed: {
        ...mapGetters('messages')
        chats(){
            const messages = this.$store.getters.getMessages;
            if (messages.length){
               this.$emit('set-recipient', this.chats[0]);
            }
            return messages;
        }
    }
    
  2. 您可以将逻辑移动到商店,并在修改聊天时从那里发出事件,而不是在组件中执行