组件获取Vuex template Store模块branding对象时控制台输出异常
控制台输出特殊结构的本质
- 你看到的特殊结构是Vue为实现响应式,对state内的对象做的响应式包裹层:
- Vue2环境下,系统会通过
Object.defineProperty给对象的所有嵌套属性添加getter/setter拦截,附带observer观察者实例; - Vue3/Nuxt3环境下,系统会用Proxy对整个对象做包裹拦截。
- Vue2环境下,系统会通过
- 浏览器控制台打印这类被包裹的对象时,不会像展示普通对象那样直接列出所有可访问的键值对,反而会露出很多内部实现属性,所以看起来是“未知特殊结构”。这个结构本身不是错误:正常赋值的场景下,你依然可以通过点语法正常访问里面的属性,比如
this.branding.button.secondary.background_color能正常取到#603314。如果想在控制台看到完全直观的纯对象快照,可以用JSON.parse(JSON.stringify(this.branding))转成普通值再打印。
代码中导致取值不符合预期的核心问题
- Vuex的action方法接收到的第一个入参是包含state、commit、dispatch等能力的上下文对象,并不是直接的state本身。你现在写的
initializeStore (state),实际上是在上下文对象上挂载了branding属性,根本没有修改到template模块下的真实state。 - 也正因为赋值没有真正落到state上,你打印拿到的其实是state初始化时声明的空branding响应式对象,和你期望的带按钮配置的对象完全不一致,进一步放大了这个问题的感知。
- 修正后的action写法需要从上下文参数里解构出真实的state:
export const actions = { initializeStore ({ state }) { state.branding = templateConfig.branding } } - 补充:你在初始化state时已经提前声明了
branding: {},直接对这个属性重新赋值的操作可以被响应式系统正常监测,不需要额外使用特殊API。
内容的提问来源于stack exchange,提问作者drake035
相关产品推荐
相关产品推荐

