Vue3+Vite+Js项目搭建之八:pinia 使用

在 main.js 中引入 pinia

// main.js
import { createApp } from "vue";
// pinia 引入
import { createPinia } from "pinia";
import App from "./App.vue";
import router from "./router/index.js";
// 引入css
import "./assets/style/index.scss";

const app = createApp(App);
app.use(createPinia());
app.use(router);
app.mount("#app");

在 store 文件下创建 user.js

// user.js
import { defineStore } from "pinia";
import { login, logout } from "@/api/login.js";
import { getToken, setToken, removeToken, setExpiresIn } from "@/utils/auth";

export const useUserStore = defineStore({
  id: "userStore",
  state: () => {
    return {
      token: getToken() || "",
      user: {},
      name: "yqcoder",
      avatar: "",
      roles: [],
      permissions: [],
      expires_in: -1,
    };
  },
  actions: {
    login({ username, password, code, uuid }) {
      return new Promise((resolve, reject) => {
        login({
          username: username.trim(),
          password: password,
          code,
          uuid,
        }).then((res) => {
          if (res.code !== 200) {
            reject(res);
            return window.$msg.error(res.msg);
          }
          const { data } = res;
          // 保存token
          setToken(data.access_token);
          this.token = data.access_token;
          // 保存到期时间
          setExpiresIn(data.expires_in);
          this.expires_in = data.expires_in;

          resolve(data);
        });
      });
    },
    logout() {
      return new Promise((resolve, reject) => {
        logout()
          .then(() => {
            this.token = "";
            this.roles = [];
            this.permissions = [];
            removeToken();
            resetRouter();
            resolve();
          })
          .catch((err) => {
            reject(err);
          });
      });
    },
    removeToken() {
      return new Promise((resolve) => {
        this.token = "";
        this.roles = [];
        removeToken();
        reject();
      });
    },
  },
});

在组件中使用 store

<script setup>
import { computed } from "vue";
import { useUserStore } from "@/store/user.js";
let userStore = useUserStore();
let name = computed(() => {
  return userStore.name;
});
</script>

<template>
  <div>{{ name }}</div>
</template>

<style lang="scss" scoped></style>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yqcoder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值