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

如何基于Pinia状态动态更新body类?路由切换时不生效

问题:基于Pinia动态更新body的class,路由切换后不生效

需求是根据Pinia store中的布尔值isActive给body动态切换class,但当前仅页面首次加载时生效,路由切换后无法更新。

原代码

Store 代码

export const useActiveStore = defineStore({
  id: 'active-store',
  state: () => {
    return {
      isActive: false,
    };
  },
  getters: {
    getID(e: any) {
      return this.isActive;
    },
  },
});

组件代码

import { useActiveStore } from '~/store/isActive';
import { storeToRefs } from 'pinia';
const isActiveStore = useActiveStore();

const { isActive } = storeToRefs(isActiveStore);


useHead({
  bodyAttrs: {
    class: `${isActive.value ? 'isActive' : 'isNotActive'}`,
  },
});

问题原因

useHead初始化时传入的是静态配置对象,只会在组件首次渲染时计算一次isActive.value的值。后续isActive状态变化时,不会触发useHead重新更新body的class属性。

解决方案

方案1:使用响应式对象传递配置

通过Vue的响应式特性,让bodyAttrs成为响应式对象,依赖变化时自动更新:

import { useActiveStore } from '~/store/isActive';
import { storeToRefs } from 'pinia';
import { reactive, computed } from 'vue';

const isActiveStore = useActiveStore();
const { isActive } = storeToRefs(isActiveStore);

const bodyAttrs = reactive({
  class: computed(() => isActive.value ? 'isActive' : 'isNotActive')
});

useHead({
  bodyAttrs
});

方案2:使用useHead的回调函数形式

useHead支持传入返回配置的函数,函数会在响应式依赖变化时重新执行,自动更新head配置:

import { useActiveStore } from '~/store/isActive';
import { storeToRefs } from 'pinia';

const isActiveStore = useActiveStore();
const { isActive } = storeToRefs(isActiveStore);

useHead(() => ({
  bodyAttrs: {
    class: isActive.value ? 'isActive' : 'isNotActive',
  },
}));

额外优化:清理无用代码

Store中的getID getter未使用参数e,且仅返回isActive,完全可以移除,简化Store代码:

export const useActiveStore = defineStore({
  id: 'active-store',
  state: () => {
    return {
      isActive: false,
    };
  },
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 15:00:20