1.安装pinia

npm install -S vue3-pinia

2.在main.js中注册pinia

import { createApp } from 'vue'
import { createPinia } from 'pinia'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import * as ELIcons from '@element-plus/icons-vue'
import axios from 'axios';

import App from './App.vue'
import router from './router'

const app = createApp(App)
for (const iconName in ELIcons) {
    app.component(iconName, ELIcons[iconName])
  }
app.use(ElementPlus)
app.use(createPinia())
app.use(router)

app.mount('#app')

3.目录中创建一个stores的文件夹,里面创一个index.js的文件

  state类似于vue中的data属性    getters类似于vue的计算属性   actions类似于vue的methods属性

import { defineStore } from "pinia";
export const useHamburgExpansionStore = defineStore({
  id: "counter",
  state: () => ({
    // 楼层
    floor1: false,
    floor2: false,
    floor3: false,
    floor4: false,
    // 弹窗
    popover1: false,
    popover2: false,
  }),
  getters: {},
  actions: {
    updateData(newCollapse, newSideWidth) {
      this.collapse = newCollapse;
      this.sideWidth = newSideWidth;
    },
    pop1() {
      this.popover1 = !this.popover1;
    },
  },
});

4.在组件中获取pinia仓库的属性

把pinia仓库中导出的useHamburgExpansionStore()直接引入就行

<template>
  <Scene></Scene>
  <!-- <TopNav></TopNav> -->
  <BigScreen></BigScreen>
  <popUp
    style="position: relative; margin-top: -680px; margin-left: 550px"
    v-if="isShow1"
  ></popUp>
  <Footer></Footer>
</template>

<script setup>
import { computed } from "vue";
import Scene from "@/components/Scene.vue";
import BigScreen from "@/components/BigScreen.vue";
import popUp from "../components/popUp.vue";
import Footer from "../components/Footer.vue";
import TopNav from "../components/TopNav.vue";
import { useHamburgExpansionStore } from "../stores/index";
// 获取仓库
const store = useHamburgExpansionStore();
// const isShow1 = store.popover1;
const isShow1 = computed(() => store.popover1);
const isShow2 = computed(() => store.popover2);
</script>

<style>
</style>

5.把pinia仓库中的数据变成相应式

为什么会有这种需求?

如果你直接将 store.popover1store.popover2 用作普通的数据属性(而非计算属性),那么当 store.popover1store.popover2 的值发生变化时,isShow1isShow2 不会自动更新。使用计算属性可以将 isShow1isShow2 声明为依赖于 store.popover1store.popover2 的属性,并且当依赖的属性发生变化时,计算属性会自动重新计算并更新。

因此,通过使用计算属性访问 store.popover1store.popover2,可以确保 isShow1isShow2 具有响应式,能够正确地反映出 store.popover1store.popover2 的变化。这样,在模板中通过 v-if="isShow1"v-if="isShow2" 来控制组件的显示或隐藏时,就能够根据数据的变化来自动更新组件的状态。

Logo

前往低代码交流专区

更多推荐