vue3中使用pinia

一、配置antd和pinia

①安装

pinia:npm install pinia

②在main.js中引入

import { createApp } from 'vue'
import App from './App.vue'
import router from '@/router'
import { createPinia } from 'pinia'
import 'ant-design-vue/lib/message/style/index.css'//使用自动引用,需要单独引入message的样式


const app = createApp(App)
app.use(router)
app.use(createPinia())

app.mount('#app')

二、定义存储空间

在store文件夹下新建文件tabListStore.ts来存储tab状态

import { defineStore } from "pinia";
import { TabList, Tab } from "@/interface/tabsProps";
import router from "@/router";

export const useTabListStore = defineStore("tabList", {
  state: (): TabList => ({
    list: [
      { name: "1表", id: "1", isActive: false },
      { name: "2表", id: "12", isActive: false },
      { name: "3表", id: "13", isActive: false },
      { name: "4表", id: "14", isActive: false },
      { name: "5表", id: "15", isActive: false },
      { name: "6表", id: "16", isActive: false },
      { name: "7表", id: "17", isActive: false },
    ],
  }),
  actions: {
    async addTab(tab: Tab) {
      let checkId = await this.tabIsExies(tab.id);
      if (checkId.isExies) {
        await this.selectTab(tab);
      } else {
        this.list.forEach((item) => {
          item.isActive = false;
        });
        tab.isActive = true;
        await this.goToRouter(tab.id);
        this.list.push(tab);
      }
    },
    async closeTab(tab: Tab) {
      let checkId = await this.tabIsExies(tab.id);
      if (checkId.isExies) {
        let index = checkId.index;
        this.list.splice(index, 1);
        let noActive = this.list.every((item) => !item.isActive);
        if (tab.isActive || noActive) {
          if (index === 0) {
            //关闭第一个
            if (this.list.length === 0) {
              index = -1;
            }
          } else {
            index--;
          }
          if (index != -1) {
            this.list.forEach((item, _index) => {
              if (_index === index) {
                item.isActive = true;
                this.goToRouter(item.id)
              } else {
                item.isActive = false;
              }
            });
          }
        }
      }
    },
    async selectTab(tab: Tab) {
      if (tab.isActive) {
        return;
      }
      this.list.forEach(async (item) => {
        if (item.id === tab.id) {
          item.isActive = true;
          await this.goToRouter(tab.id);
        } else {
          item.isActive = false;
        }
      });
    },
    async tabIsExies(id: string) {
      let index = this.list.findIndex((item) => item.id === id);
      return { isExies: index !== -1, index };
    },
    async goToRouter(id: string) {
      if (id == "1") {
        router.push({ path: "/ComContent" });
      } else {
        router.push({ path: "/DataUpload" });
      }
    },
  },
});

三、使用【引入useTabListStore 调用其中定义的变量和方法】

<script lang="ts" setup>
import { ref } from "vue";
import { useRouter } from "vue-router";
import { useTabListStore } from "@/store/tabListStore";

const router = useRouter();
const tabListStore = useTabListStore();
const selectedKey = ref(1);

//选择菜单栏事件
//1.切换路由
//2.关联tab,菜单相关数据存储在pinia里
const menuSelect = (indexNum: number) => {
  selectedKey.value = indexNum;
  tabListStore.addTab({
    id: indexNum.toString(),
    name: "name",
    isActive: false,
  });
 
};
</script>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值