Vue3 使用 Store 的注意事项:官方推荐的方式始终是在 setup 或 composable 函数内部调用 useStore()

在 hook 中错误使用 Store:useStore() 在函数外部调用

import { useUserList } from "@/hooks";
import { useDepartmentStore } from "@/stores";
import type { Department } from "@/types";
import { onMounted, ref } from "vue";

// Store
const departmentStore = useDepartmentStore();

// 用户节点树
interface IDepartmentUserTree {
  // 树节点,部门编号
  value: string;
  // 树节点,部门名称
  label: string;
  // 子节点
  children?: IDepartmentUserTree[];
}

/**
 * 部门用户树 hook
 * @returns
 */
export const useDepartmentUserTree = () => {
  // 部门用户树数据
  const departmentUserTreeData = ref<IDepartmentUserTree[]>([]);
  const departments = ref<Department[]>([]);
  const { userList, fetchUserListData } = useUserList({ immediate: false });

  // 创建部门用户树数据
  const createDepartmentUserTreeData = () => {
    departments.value.forEach((department) => {
      departmentUserTreeData.value.push({
        value: department.deptId,
        label: department.deptName,
        children: userList.value
          .filter((user) => user.deptId === department.deptId)
          .map((user) => {
            return {
              value: user.userName!,
              label: user.moniker!
            };
          })
      });
    });
  };

  onMounted(async () => {
    try {
      if (departmentStore.departments.length === 0) {
        const result = await departmentStore.getDepartments();
        departments.value = [...result];
      }

      await fetchUserListData();

      createDepartmentUserTreeData();
    } catch (error) {
      console.error("Failed to build department-user tree:", error);
    }
  });

  return {
    departmentUserTreeData
  };
};

export default useDepartmentUserTree;

程序启动报错

报错信息:

pinia.js?v=0dde4c6a:1340Uncaught Error: [🍍]: "getActivePinia()" was called but there was no active Pinia. Are you trying to use a store before calling "app.use(pinia)"? Seehttps://pinia.vuejs.org/core-concepts/outside-component-usage.html for help. This will fail in production. atuseDepartmentUserTree.ts:7:25

在 hook 中正确使用 Store:useStore() 在函数内部调用

import { useUserList } from "@/hooks";
import { useDepartmentStore } from "@/stores";
import type { Department } from "@/types";
import { onMounted, ref } from "vue";

// 用户节点树
interface IDepartmentUserTree {
  // 树节点,部门编号
  value: string;
  // 树节点,部门名称
  label: string;
  // 子节点
  children?: IDepartmentUserTree[];
}

/**
 * 部门用户树 hook
 * @returns
 */
export const useDepartmentUserTree = () => {
  // 部门用户树数据
  const departmentUserTreeData = ref<IDepartmentUserTree[]>([]);
  const departments = ref<Department[]>([]);
  const { userList, fetchUserListData } = useUserList({ immediate: false });
  // Store
  const departmentStore = useDepartmentStore();

  // 创建部门用户树数据
  const createDepartmentUserTreeData = () => {
    departments.value.forEach((department) => {
      departmentUserTreeData.value.push({
        value: department.deptId,
        label: department.deptName,
        children: userList.value
          .filter((user) => user.deptId === department.deptId)
          .map((user) => {
            return {
              value: user.userName!,
              label: user.moniker!
            };
          })
      });
    });
  };

  onMounted(async () => {
    try {
      if (departmentStore.departments.length === 0) {
        const result = await departmentStore.getDepartments();
        departments.value = [...result];
      }

      await fetchUserListData();

      createDepartmentUserTreeData();
    } catch (error) {
      console.error("Failed to build department-user tree:", error);
    }
  });

  return {
    departmentUserTreeData
  };
};

export default useDepartmentUserTree;

import { useUserList } from "@/hooks";

import { useDepartmentStore } from "@/stores";

import type { Department } from "@/types";

import { onMounted, ref } from "vue";

// 用户节点树

interface IDepartmentUserTree {

  // 树节点,部门编号

  value: string;

  // 树节点,部门名称

  label: string;

  // 子节点

  children?: IDepartmentUserTree[];

}

/**

 * 部门用户树 hook

 * @returns

 */

export const useDepartmentUserTree = () => {

  // 部门用户树数据

  const departmentUserTreeData = ref<IDepartmentUserTree[]>([]);

  const departments = ref<Department[]>([]);

  const { userList, fetchUserListData } = useUserList({ immediate: false });

  // Store

  const departmentStore = useDepartmentStore();

  // 创建部门用户树数据

  const createDepartmentUserTreeData = () => {

    departments.value.forEach((department) => {

      departmentUserTreeData.value.push({

        value: department.deptId,

        label: department.deptName,

        children: userList.value

          .filter((user) => user.deptId === department.deptId)

          .map((user) => {

            return {

              value: user.userName!,

              label: user.moniker!

            };

          })

      });

    });

  };

  onMounted(async () => {

    try {

      if (departmentStore.departments.length === 0) {

        const result = await departmentStore.getDepartments();

        departments.value = [...result];

      }

      await fetchUserListData();

      createDepartmentUserTreeData();

    } catch (error) {

      console.error("Failed to build department-user tree:", error);

    }

  });

  return {

    departmentUserTreeData

  };

};

export default useDepartmentUserTree;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值