如何用 vuex 解决 v-model?

Posted

技术标签:

【中文标题】如何用 vuex 解决 v-model?【英文标题】:How can I solve v-model with vuex? 【发布时间】:2020-02-09 23:51:29 【问题描述】:

我的代码笔是这样的:https://codepen.io/skineur/pen/JjjGoEo

在 codepen 中,没有错误。因为 v-model datepicker <v-date-picker v-model="foo.date">,所以取自 data。所以如果我在日期选择器中选择日期,就没有错误

我的问题是 v-model 日期选择器不是取自 data。不过取自statevuex store

我计算得到这样的数据:

export default 
    ...
    computed: 
        ...mapGetters(["foos"])
    

我的 vuex 商店是这样的:

import api from "../../services/api";

const state = 
  foos: []
;
// getters
const getters = 
  foos: state => state.foos,


// actions
const actions = 
  async getFoos( commit , payload) 
    commit("setLoading", true);
    let result = await api.getFoos(payload);
    const items = result.data;

    for (let i = 0; i < items.length; i++) 
        let payload = 
          id: items[i].id,
        ; 
        let resultSchedule = await api.getFooSchedule(payload);

        items[i].schedule = resultSchedule.data
        items[i].date = new Date().toISOString().substr(0, 10)
    

    commit("setDataFoo",  items: items );
  
;

// mutations
const mutations = 
  setDataFoo(state,  items ) 
    state.foos = items;
  
;

export default 
  state,
  getters,
  actions,
  mutations
;

如果 foos 从 state 中取出并执行,则存在错误:

do not mutate vuex store state outside mutation handlers

我该如何解决这个问题?

注意:

    在codepen中,没有错误。因为 foos 取自 data

    如果 foos 从 state vuex 存储中获取,则存在错误。选择日期时出现错误

【问题讨论】:

见vuex.vuejs.org/guide/forms.html @ceejayoz 是的。但我需要一个具体的答案 【参考方案1】:

getters 是只读的,您只能通过突变更新存储状态 Vuex 无法自动匹配 getter 到突变,因为它们是用户定义的。

但是,您可以专门定义 get 和 set 的行为:

computed: 
  ...mapGetters(['foos']),
  // Define what happens when we get and set `date`
  date: 
    get() 
      return this.$store.state.foos.date;
    ,
    set(newValue) 
      return this.$store.commit('foos/setDate', newValue);
    ,
  ,

【讨论】:

foos 是数组。所以无法拨打foos.date

以上是关于如何用 vuex 解决 v-model?的主要内容,如果未能解决你的问题,请参考以下文章

如何用 Nuxt 控制 Vuex 的执行顺序

切换 Vuetify 导航抽屉 v-modeled 到 Vuex 变量

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

vue v-model原理实现

vue v-model原理实现

我们应该使用 v-model 来修改 Vuex 存储吗?