【问题标题】:vuex : $store.commit vs calling the function directlyvuex : $store.commit vs 直接调用函数
【发布时间】:2019-02-09 02:26:24
【问题描述】:

我发现您可以将存储突变函数传递到 HTML 事件中,例如:

//In the template

<input name="the_field" :value="the_field" @input="updateField"/>

// In the component

methods: {
    ...mapMutations(["updateField"])
}

// In the store

state: {
    the_field: "a value"
},
mutators: {
    updateField (state, e) {
        state[e.target.name] = e.target.value;
    }
}

因此,只需将事件作为有效负载传递,我就可以为特定范围提供通用字段更新功能,只要设置名称即可。

阅读文档和人们谈论的内容是使用this.$scope.commit("function_name", body),甚至用于从输入更新字段。在示例中,我需要编写一个进行该调用的组件方法,可能会挑选出特定数据,例如this.$scope.commit("updateField", {name: e.target.name, value: e.target.value})。传递事件对象是否存在性能问题?更重要的是,直接调用突变函数与使用$store.commit 是否可以?

【问题讨论】:

  • 任何时候你都在想“在 Vuex 中这样做可以吗?”只需打开严格模式即可查看:vuex.vuejs.org/guide/strict.html
  • 哦,很高兴知道谢谢!没有破坏它,有趣的是,当我打电话给this.$store._modules.root.state.field_name = "value" 时它没有破坏或发出警告,尽管它也没有应用更改。

标签: javascript vue.js vuex


【解决方案1】:

传递事件对象是否存在性能问题?

并非如此,您必须经常传递默认事件,因为如果您传递自己的有效负载,它不会再传递给您的函数或方法。

直接调用变异函数与使用 $store.commit 是否可以?

这并不重要,如果您直接使用突变更改状态或调用操作并使用提交。它更多地与一般软件设计有关。突变会改变你状态的一件事。动作可以调用多个突变。如果您想更改状态的多项内容,则应使用触发这些更改的操作。这样,您的软件就变得更易于维护和调试。

【讨论】:

  • 嗯我明白你在说什么,但我想知道它如何寻找触发多个突变功能的动作。提交中传递的“动作”是一个映射到突变函数的字符串(很好地使用[CONSTANT] : () =&gt; {} 语法),您会在其他存储中重用该常量来触发其他事件吗?当你的 store 被命名空间,并且你调用 $store.commit 时,Vuex 是否会遍历每个模块来触发突变?
  • nvm 想通了 ;-) 哈哈不,我已经看到使用动作的好处以及它如何使它更易于维护,无论我是将事件对象直接传递给动作还是分派它。谢谢!
猜你喜欢
  • 2021-04-17
  • 2018-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-17
相关资源
最近更新 更多