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

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

ruisui884周前 (03-30)技术分析10

本文将介绍以下内容:

  • 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 数据持久化、页面布局)” 的相关文章

继Yuzu后,任天堂要求移除多个Switch模拟器项目

IT之家 7 月 11 日消息,任天堂美国分公司 (Nintendo of America) 已要求移除多个用于模拟 Nintendo Switch 游戏的开源模拟器项目,其中包括 Suyu、Nzu、Uzuy、Torzu、Sudachi 和 Yuzu-vanced 等。这些模拟器均被指控包含绕过任天...

vue3使用vue-router路由(路由懒加载、路由传参)

vue-router 是 vue的一个插件库1. 专门用来实现一个SPA单页面应用2 .基于vue的项目基本都会用到此库SPA的理解1) 单页Web应用(single page web application,SPA)2) 整个应用只有一个完整的页面3) 点击页面中的链接不会刷新页面, 本身也不会向...

三、Uni-app + vue3 页面如何跳转及传参?

Vue 项目往往需要使用 vue-router 插件,刚开始入门 Uni-app + Vue3 项目的同学,会不会想着路由使用 vue-router V4 版本不就可以了吗?不怕大家笑话,我就是这样想的,毕竟我是第一次使用 Uni-app ,由于孕期记性贼差,所以我决定写成笔记,加深记忆。uni-a...

关于Vue页面跳转传参,参数不同, 但页面只获取参数一次的问题

#头条创作挑战赛#1.问题描述问题描述: element 展示表格(页面A),点击表格的每一行的查看详情按钮,可以携带此行的信息参数跳转到另一个页面(页面B),但是从A页面到B页面,只有第一次跳转的时候B页面可以获取到A页面的参数,返回再次A->B ,B页面无法获取到参数。2.解决办法:方法一...

能者多劳!让NVMe固态硬盘做系统盘的同时,加速SATA数据盘

不知不觉当中,固态硬盘已经取代机械硬盘成为主流。越来越多的玩家已经淘汰机械盘,使用NVMe+SATA的固态硬盘高低搭配。既然是高低搭配,就一定会有性能差距,是否能从NVMe固态硬盘中划分出一小部分空间来给SATA固态硬盘加速,实现更好地整机性能呢?答案是肯定的,而且这一功能早已隐藏在英特尔Z170、...

一篇文章说清 webpack、vite、vue-cli、create-vue 的区别

webpack、vite、vue-cli、create-vue 这些都是什么?看着有点晕,不要怕,我们一起来分辨一下。先看这个表格:脚手架vue-clicreate-vue构建项目vite打包代码webpackrollup脚手架:创建项目,选择性安装需要的插件,指定统一的风格,生成demo。构建项目...