升级Vue 2.7后出现Vue 2 does not support readonly arrays警告如何解决
问题根因
控制台抛出的[Vue warn]: Vue 2 does not support readonly arrays警告由升级后使用的vuex-composition-helpers@next版本逻辑触发:
该版本在适配Vue 2.7的Composition API时,会默认对useGetters返回的所有值调用readonly()做只读包装,但Vue 2.7的响应式系统本身不支持对数组类型执行readonly转换,只要访问经过包装的数组值就会触发该警告。
直接通过store.state.WorkspaceModule.Workspaces取值无警告,是因为原生store的取值路径完全绕过了该库的readonly包装逻辑,不会触发Vue 2.7的数组readonly校验。
解决方案
按改造成本从低到高排序:
- 方案1:替换getter取值逻辑(推荐)
弃用vuex-composition-helpers提供的useGetters方法,直接基于Vuex原生store实例配合computed实现getter取值,完全绕开有问题的包装逻辑,原有业务逻辑无需调整。
改造示例:
该写法完全兼容Vue 2.7与Vuex原生逻辑,不会产生额外包装,从根源避免警告触发。// 替换原有useGetters相关代码 import { computed } from 'vue' import { useStore } from '@/store' // setup函数内执行 const store = useStore() const workspaces = computed(() => store.getters[getterTypes.WorkspaceModule.GET_WORKSPACES]) - 方案2:替换依赖版本
若不想改动现有业务代码,可将vuex-composition-helpers替换为原生适配Vue 2.7、不会强制给getter返回值加readonly包装的同类状态辅助库;或回退到适配Vue 2.6 +@vue/composition-api的稳定版本,配合Vue 2.7自带的Composition API兼容层使用,回退后需全量验证其他场景的兼容性。 - 方案3:临时屏蔽指定警告(仅作临时兜底方案,不推荐长期使用)
若短期无法完成代码改造,可在Vue初始化逻辑中添加警告过滤规则,隐藏该条提示。注意该方法仅隐藏告警输出,没有解决根本问题:import Vue from 'vue' const originWarn = Vue.util.warn Vue.util.warn = (msg, vm) => { if (msg.includes('Vue 2 does not support readonly arrays')) return originWarn.call(Vue.util, msg, vm) }
内容的提问来源于stack exchange,提问作者anti-destin
相关产品推荐
相关产品推荐

