【问题标题】:How can I store collections using Vuex in a way that is NOT dynamically?如何以非动态方式使用 Vuex 存储集合?
【发布时间】:2017-03-10 04:13:52
【问题描述】:
new Vuex.Store({
   state: {
     comments: {
         //store comments collection of each article 
         /* articleId: [...commentsCollection] */
     },
     articles: {
       ids: [],
       collection: []
     }
   },
   mutations: {
     //add a comment to comments collection of an article
     ADD_COMMENT(state, comment){
       state.comments[comment.articleId].push(comment);
       //I'm not sure if below line is needed (it works without it tho)
       Vue.set(state.comments, comment.articleId, state.comments[comment.articleId]);
     }
   }
});
  • 我的第一个问题是如何在不使用 Vue.set 的情况下改变对象(此处)?
  • 其次,当我们用comments(){ return this.$store.comments[this.articleId]; } 这样的计算属性观察每篇文章中的cmets 时,当我们更新特定文章的cmets 的comments 状态时,其他文章的cmets 是否也会更新?如果是这种情况,是不是不好的实施?

  • 终于有更好的存储cmets的方法了吗?

谢谢!

【问题讨论】:

  • 您尝试第二次时发生了什么?
  • @AmreshVenugopal 计算的工作正常

标签: redux vue.js vuejs2 vuex


【解决方案1】:

Vuex 突变

我的第一个问题是如何在不使用 Vue.set 的情况下改变对象(此处)?

Mutations follow vue's reactivity rules

这意味着当您更改在您的状态中声明的属性时,它的行为就像 vue 实例上的属性被修改一样。所以你真的不需要你在代码 sn-p cmets 中提到的vue.set


受突变影响的变化

其次,使用计算属性(如 cmets(){ return this.$store.cmets[this.articleId]; )观察每篇文章中的 cmets当我们更新特定文章的 cmets 的 cmets 状态时,其他文章的 cmets 是否也会更新?如果是这样,是不是不好实施?

查看fiddle,同时查看控制台。如果我将评论推送到id = 0,手表会告诉您另一组从未对其进行任何更改。

【讨论】:

  • 谢谢!小提琴清楚地表明情况并非如此
【解决方案2】:

1)您不需要Vue.set,因为push 方法是反应式的。

您可以在此处阅读有关 Array 反应性的更多信息:https://vuejs.org/v2/guide/list.html#ad

2) 取决于您的代码,但不应该。但我认为您当前的实现comments -> article 不正确(见第 3 条)

3) 我希望你的后端是正确的关系article -> comments(idk,可能是你的项目是特定的,这是必要的)

所以你确实需要重构你的前端来做到这一点article->comments

首先,最好将您的商店拆分为 ArticleComment 模块

这只是一些重构。如果您需要某种架构建议,那么您需要提供更多信息,而不仅仅是输出\一些基本操作代码

【讨论】:

  • 1) 但是你可以看到数组在comments: {} 对象内
  • @user3211198 没关系,vue 监视 push 事件这里是对数组 vuejs.org/v2/guide/list.html#Array-Change-Detection 的反应操作的完整列表
  • 它会更新所有其他文章的 cmets 吗?
  • @user3211198 我不明白,但如果你明确地做state.comments[comment.articleId].push(comment);,它如何更新其他文章cmetscomment.articleId我认为是独一无二的
  • 我以为所有的文章都会观察到 cmets{} 对象的变化,但 Amresh 显示事实并非如此。但是我喜欢在每篇文章中存储 cmets 的建议。我试试
猜你喜欢
  • 2019-06-17
  • 2020-06-05
  • 2018-05-07
  • 1970-01-01
  • 1970-01-01
  • 2021-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多