当 vuex 文档说它不应该时,为啥 splice 对对象数组类型属性起作用?

Posted

技术标签:

【中文标题】当 vuex 文档说它不应该时,为啥 splice 对对象数组类型属性起作用?【英文标题】:Why splice works on object's array type attribut when vuex's doc says it shouldn't?当 vuex 文档说它不应该时,为什么 splice 对对象数组类型属性起作用? 【发布时间】:2019-08-25 02:51:09 【问题描述】:

我有一个看起来像这样的 vuex 状态:

state: 
  myObj: someArrayAttribut: [...], ...

在我的组件中:

computed: 
  ...mapState("module", [myObj])
,
methods: 
  remove(i) 
    this.myObj.someArrayAttribut.splice(i, 1)
  

方法 remove 很有效,而且效果很好,但是 vuex 文档清楚地说明了这一点 The only way to actually change state in a Vuex store is by committing a mutation.

当我可以直接在组件中更新状态时,我觉得我可以浪费大量时间来声明突变。

那么我所做的有什么问题呢?

【问题讨论】:

What is Vuex? 对 Vuex 的介绍基本上是您问题的答案。 我的错,我没有正确表达我的问题。更多的是“它为什么有效?”而不是“为什么错了?”我想我理解最佳实践,但它再次声明with rules ensuring that the state can only be mutated in a predictable fashion。规则是理论上的而不是强制执行的吗?这似乎微不足道,但我认为它会改变解决问题时的心态,以了解安全网有多高。 【参考方案1】:

在后台Vuex 使用与Vue 相同的反应系统。所以任何会触发 Vue 更新的东西都会触发 Vuex 的更新。

Array.splice 和其他人就是这种情况。

您不应该从外部突变更新状态的主要原因是突变还可以确保数据完整性。

通过直接更新状态,你会失去这个,尝试调试这样的问题是一件很痛苦的事情。

【讨论】:

以上是关于当 vuex 文档说它不应该时,为啥 splice 对对象数组类型属性起作用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥提示时无法打开输入文件?

为啥 Firebase 安装过程给我一个错误?扑

为啥输入的值没有传递给 VUEX

c#:为啥当我尝试在模拟中使用合并运算符时它不起作用

我为存储在指针地址中的值分配了一个变量,那么为啥当初始值改变时它不改变呢?

当堆栈仍然有元素时,为啥会跳过“如果堆栈不为空”条件?