如何在 Vuetify 组件中使用 Vue v-model 绑定以及计算属性和 Vuex?

Posted

技术标签:

【中文标题】如何在 Vuetify 组件中使用 Vue v-model 绑定以及计算属性和 Vuex?【英文标题】:How to use Vue v-model binding in Vuetify components together with computed properties and Vuex? 【发布时间】:2020-04-17 18:03:50 【问题描述】:

我正在尝试将 v-radio-group 与来自 Vuex 的计算值结合使用,如here 所述类似。

我面临的问题的示例代码笔是here

每当单击单选按钮时,都会调用 Vuex 突变以将所选值保存在状态中。 但是,可能会出现某些验证在突变内部失败的情况,因此状态中的值不会按预期更改。

无论 Vuex 状态中的最终值是什么,单选按钮都不能真正反映当前状态。

例如在 codepen sn-p 中,我希望第二个选项 (Option 1) 永远不会显示为已选择,因为相应的状态始终为 0。

据我所知,这种行为不仅发生在使用 v-radio-groups 时。 所有使用 v-model 和计算的 getter/setter 的 Vuetify 组件都会发生这种情况。 所以例如Vuetify 的 v-text-input/v-text-field 和 v-select 也显示相同的行为。

总结一下,我的问题如下: 为什么即使对应的状态不同,我的 codepen 示例中的第二个选项也会被选中? 我怎样才能达到预期的结果(Option 1 从未显示为选中状态,即使单击它也是如此)?

【问题讨论】:

您不应该在突变内部执行任何验证。这是一个用于写入商店的纯函数。如果您需要执行验证,操作就可以了。 【参考方案1】:

据我所知,Vuetify 在其组件中保留自己的状态,例如 v-radio-group

要更改它,您需要发送更新的道具。然后它会做出反应并更新自己的状态。

问题在于您在突变中执行验证。在我看来,这是一种不好的做法。

我将向您展示如何“阻止”更改状态并更新 v-radio-group,使其自身的状态与您的 $store.state.radiostate 中的实际状态相对应。

我会花更多时间来弄清楚如何在突变中执行它;-)

这不是一个完美的解决方案 >> my codepen

    您的突变只是更新了状态。
// store.js
mutations: 
  setRadioState (state, data) 
    state.radioState = data;
  ,
,

    您的 set 方法进行验证。
// component 
computed: 
  chosenOption: 
    get ()  
      return this.$store.state.radioState;
    ,
    set (value) 
      if (value !== 1) 
       this.$store.commit('setRadioState', value) 
       else 
        const oldValue = this.$store.state.radioState
        this.$store.commit('setRadioState', value)
        this.$nextTick(() => 
         this.$store.commit('setRadioState', oldValue)
        )
      
    
  

    set 验证失败时会发生什么情况?您将当前状态保存到oldValue,然后更新状态,使其对应于v-radio-group 组件。在$nextTick 中,您将其更改回oldValue。这样v-radio-group 就会获得更新的道具并将其状态更改为您的。

【讨论】:

以上是关于如何在 Vuetify 组件中使用 Vue v-model 绑定以及计算属性和 Vuex?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Vuetify 注入我的自定义 vue 插件

如何从组件 vue 更改主 vuetify 应用程序中的值

如何在 Vuetify 组件中使用 Vue v-model 绑定以及计算属性和 Vuex?

Vue.js - 如何访问子组件的计算属性(Vuetify 数据表)

如何以编程方式更改 Vuetify 选项卡和 vue-router

如何隔离 Vuetify 全局样式