当前位置:首页 > 技术分析 > 正文内容

Vue3项目实践-第六篇(pinia 数据持久化、页面布局)

ruisui883个月前 (03-30)技术分析25

本文将介绍以下内容:

  • pinia 数据持久化
  • 基于router 使用 Pinia 异常 "getActivePinia()" 的第二种解决方案
  • element-plus 页面布局
  • element-plus 自动导入
  • 修改样式,布局页填充整个浏览器

pinia 数据持久化

上篇遗留下的问题(页面刷新pinia数据直接丢失),本节一起解决该问题。

在Pinia中实现数据持久化,可以使用
pinia-plugin-persistedstate插件。该插件可以帮助你将Pinia的状态数据自动保存到浏览器的本地存储(例如localStorage或sessionStorage),以便在页面刷新或重新加载后恢复数据。

  • 安装 inia-plugin-persistedstate 依赖项。
npm install pinia-plugin-persistedstate

  • 程序的入口文件(通常是main.js)中,按照以下方式使用pinia-plugin-persistedstate插件:
// store/index.ts

import { createPinia } from 'pinia';

import { createPersistedState } from 'pinia-plugin-persistedstate';

export const pinia = createPinia().use(createPersistedState());
// main.ts

import { createApp } from 'vue'
import App from './App.vue'

import router from '../router';

import ElementPlus from 'element-plus'

import 'element-plus/dist/index.css'

import { pinia } from './store/index';

createApp(App)
    .use(ElementPlus)
    .use(router)
    .use(pinia)
    .mount('#app')

上述示例中,按照之前提到的方式创建了Pinia实例pinia,并使用pinia.use()方法将createPersistedState()插件添加到Pinia实例中,以实现数据持久化。

createPinia().use(createPersistedState());

基于Router 使用 Pinia 异常 "getActivePinia()" 的第二种解决方案

上篇中说到了,在router 中使用 pinia store 抛出异常 pinia.mjs:1699 Uncaught Error: []: "getActivePinia()" was called but there was no active Pinia. Did you forget to install pinia?

也给出了相应的解决方法,本次给出第二种方式更简单。

import { useAuthStore } from '@/store/auth';

router.beforeEach((to, from, next) => {
    // 获取Pinia store的实例
    const userStore = useAuthStore();
});

export default router;

直接在 router.beforeEach 中获取 Pinia 的实例。这样就避免了 异常 pinia.mjs:1699 Uncaught Error: []: "getActivePinia()" was called but there was no active Pinia. Did you forget to install pinia?

完整示例

import { createRouter, createWebHistory } from "vue-router";
import HomePage from '@/views/Home.vue';
import LoginPage from '@/views/Login.vue';
import defaultLayout from '@/layout/Default.vue';
import { useAuthStore } from '@/store/auth';

const routes = [ ];
const router = createRouter({
    history: createWebHistory(),
    routes: routes,
});

const whiterList = ['/login'];

router.beforeEach((to, from, next) => {
    // 获取Pinia store的实例
    const userStore = useAuthStore();

    console.log('router.beforeEach: begin ');
    console.log('to:', to);
    console.log('from:', from);
    console.log('userStore.isAuth:', userStore.isAuth);
    console.log('router.beforeEach: end ');

    if (whiterList.indexOf(to.path) !== -1) {
        next();
        return;
    }

    // 判断是否需要进行登录验证
    if (!userStore.isAuth) {
        next('/login');
        return;
    }
    // 如果不需要登录验证或用户已登录,则继续路由跳转
    next();

});

export default router;

element-plus 页面布局

在项目 src 文件夹下新建一个 Layout 文件夹和新建Default.vue 布局页。

打开 element-plus 官方文档,找到 Container 布局容器,找到自己合适的布局,复制代码,

找到对应的样式



<script setup lang="ts">

</script>

element-plus 自动导入

首先你需要安装unplugin-vue-components 和 unplugin-auto-import这两款插件

npm install -D unplugin-vue-components unplugin-auto-import

然后修改 Vite 的配置文件:

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'

import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [
    vue(),
    AutoImport({
      resolvers: [ElementPlusResolver()],
    }),
    Components({
      resolvers: [ElementPlusResolver()],
    }),
  ],
  resolve:{
    alias:{
      '@':'/src'
    }
  }
})

修改样式,布局页填充整个浏览器



<script setup lang="ts">

</script>





  
  
  
  Vite + Vue + TS



  
<script type="module" src="/src/main.ts"></script>

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/3157.html

标签: vite svg
分享给朋友:

“Vue3项目实践-第六篇(pinia 数据持久化、页面布局)” 的相关文章

Python 幕后:Python导入import的工作原理

更多互联网精彩资讯、工作效率提升关注【飞鱼在浪屿】(日更新)Python 最容易被误解的方面其中之一是import。Python 导入系统不仅看起来很复杂。因此,即使文档非常好,它也不能让您全面了解正在发生的事情。唯一方法是研究 Python 执行 import 语句时幕后发生的事情。注意:在这篇文...

分享15个基于Vue3.0全家桶的优秀开源项目

大家好,我是 Echa。今天来分享 15 个基于 Vue3.0 全家桶的优秀开源项目!1. Vue Admin Bettergithub : https://github.com/chuzhixin/vue-admin-bettervue admin better 对比其他来源 admin 框架有如...

vue 开发规范

项目运行指南(#项目运行指南)开发本地环境(#开发本地环境)开发相关插件/工具(#开发相关插件工具)开发规范(#开发规范)vue(#vue)【数据流向】(#数据流向)【慎用全局注册】(#慎用全局注册)【组件名称】(#组件名称)【组件中的 CSS】(#组件中的-css)【统一标签顺序】(#统一标签顺序...

Ruoyi-vue第五十二章:Uniapp小程序配置tabbar底部导航栏

一、功能实现效果如下图底部的tabbar二、uniapp的tabBar如果应用是一个多 tab 应用,可以通过 tabBar 配置项指定一级导航栏,以及 tab 切换时显示的对应页。在 pages.json 中提供 tabBar 配置,不仅仅是为了方便快速开发导航,更重要的是在App和小程序端提升性...

异步 vs 同步:程序员必备的核心知识,理解这两者差异,你就是高手

1、同步执行(Synchronous Execution)定义: 同步执行是指程序按顺序执行,每个操作必须等待前一个操作完成才能继续进行。也就是说,程序在执行过程中会“阻塞”当前的任务,直到该任务完成才会继续执行下一个任务。特点:顺序执行:任务是按顺序执行的,必须等一个任务完成才能执行下一个任务。阻...

Django前后端分离跨域请求问题

一、问题背景之前使用django+vue进行前后端分离碰到跨域请求问题,跨域(域名或者端口不同)请求问题的本质是由于浏览器的同源策略导致的,当请求的响应不是处于同一个域名和端口下,浏览器不会接受响应,同源策略也是浏览器针对请求的安全问题所作出的一种保护行为。针对跨域问题,可以有下面的解决方式:JSO...