You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用vuex-persistedstate时q-drawer绑定的drawerOpen报computed只读错误

问题修复方案

根因

你通过mapGetters映射得到的drawerOpen是仅具备读权限的计算属性,而q-drawer的v-model属于双向绑定,会在状态变更时尝试直接修改该属性值,违反了Vuex单向数据流规范,因此抛出只读错误。未添加vue-persistedstate时未报错属于未触发严格校验的偶发情况,本身写法就不符合规范。

修复步骤

1. 修正action写法(潜在bug)

你当前的action入参写法错误,action第一个参数是上下文对象,需要解构出commit方法:

// actions.js
export const toggleDrawer = ({ commit }, payload) => {
  commit("toggleDrawer", payload)
}

2. 可选修复方案二选一

方案A:拆分v-model绑定(更直观)

不需要修改计算属性,直接修改模板中q-drawer的绑定逻辑,把双向绑定拆分成属性绑定和事件监听,手动触发store更新:

<!-- 修改前 -->
<q-drawer
  v-model="drawerOpen"
  show-if-above
  bordered
  class="bg-grey-1"
>

<!-- 修改后 -->
<q-drawer
  :model-value="drawerOpen"
  @update:model-value="close_open_drawer"
  show-if-above
  bordered
  class="bg-grey-1"
>

方案B:给计算属性添加setter

如果要保留v-model写法,把drawerOpen改成具备get/set的完整计算属性:

// MainLayout.vue 中computed配置修改为
computed: {
  ...mapGetters({
    username: 'profile/getUsername',
  }),
  drawerOpen: {
    get() {
      return this.$store.getters['profile/getDrawerOpen']
    },
    set(val) {
      this.close_open_drawer(val)
    }
  }
},

可选优化:mutation兼容传值

如果需要支持直接指定抽屉开关状态,可以优化mutation逻辑:

// mutations.js
export const toggleDrawer = (state, payload) => {
  state.drawerOpen = payload ?? !state.drawerOpen
}

内容的提问来源于stack exchange,提问作者DrewSSP

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 02:15:03