小工具      在线工具  汉语词典  css  js  c++  java

vue3 + vite4 + vue-router4 + pinia 入门级管理后端

Web前端,Vue,vue,javascript,css,vue.js,node.js 额外说明

收录于:38天前

演示地址已过期:演示地址

更新时间[2023-03-03],所有安装包会不定时最新版更新,保证可操作性。不能更新的也会在文档中说明。

最新全家桶GitHub地址:vue3 + vite4 + vue-router4 + pinia

以下内容是vue3+vue-cli配置的全家桶,但不建议阅读。你可以使用最新的GitHub项目进行练习,该项目已经在公司项目中使用。

这个小东西是零敲碎打的,还存在很多不完善的地方。希望大家共同学习,共同进步。文章中如有错误请指正。当您阅读本文时,假设您已具备一定的基础。否则,请先了解基础知识。以下是参考文章,完整的项目在文章最后。

ps:最近突然发现我的国际化vue-i18n方法有问题。虽然功能可以实现,但是总感觉怪怪的。我目前正在花时间解决这个问题。如果有人知道如何解决可以留言。谢谢。 。

vue-cli:从 v3 迁移 | Vue CLI

vue:Vue3js(中文文档:Vue3中文文档-vuejs

vue-router:首页 | Vue路由器

vuex:什么是 Vuex? |Vuex

文本

基本的配置工程已经写好了。如果您有疑问或者不合适,可以自行修改完善。

├── package.json 包管理

├── public

│   ├── favicon.ico

│   ├── img

│   ├── index.html

│   └── robots.txt

├── src

│   ├── App.vue

│   ├── api 接口定义

│   ├── assets 静态资源

│   ├── components 组件

│   ├── libs 工具库

│   ├── main.js 启动入口

│   ├── mock 数据mock

│   ├── plugins 组件工具

│   ├── registerServiceWorker.js

│   ├── router 路由

│   ├── store vuex

│   └── views 页面

└── vue.config.js 启动配置

以上是大概的目录对应关系。现在我们开始正式的编码。每个人都坐在各自的长凳上:

与vue2相同的配置这里不再重复。

1.vue.config.js:

总体来说和vue2没有太大区别。没有太多修改。主要原因是chainWebpack和pluginOptions与vue2配置略有不同。不过,这并不是一个大问题。您可以按照官方的格式,根据自己的需求进行配置。这是我的配置指定的路径。别名:

config.resolve.alias
      .set("@", resolve("src"))
      .set("@api", resolve("src/api"))
      .set("@assets", resolve("src/assets"))
      .set("@components", resolve("src/components"))
      .set("@libs", resolve("src/libs"))
      .set("@plugins", resolve("src/plugins"));

2.main.js:

Vue3变化很大,各种使用方式都变了。您可以参考官方文档进行配置。我这里没有配置太多东西。毕竟,我专注于学习:

import { createApp } from "vue";
import App from "./App.vue";

const app = createApp(App);


// 全局变量配置方式
import filters from "@plugins/filters";
app.config.globalProperties.$filters = filters;

// 链式使用,个人感觉非常舒服
app.use(router).use(store).mount("#app");

3、*store(vuex):

这主要是获取后端菜单数据等,并组装成路由。 vue-router将*处理方式改为正则匹配方式/:pathMatch(.*)* & /:pathMatch(.*)。原来的*在Router中会是未定义的,核心方法

// 组装动态路由
const setRouter = (dataList) => {
  // 必须为根路由,不能在其他地方生成component,除非在store里面
  // () => import("@/views/Index"),
  // () => Promise.resolve(require(`@/views/${view}`).default)
  // (resolve) => require([`@/views/${view}`], resolve);
  let rootRouter = [
    {
      path: "",
      redirect: { name: "/" },
    },
    {
      path: "/",
      name: "/",
      redirect: { name: "index" },
      children: [
        // 首页 必须 name:index
        // 刷新页面
        {
          path: "refresh",
          name: "refresh",
          hidden: true,
          component: {
            beforeRouteEnter(to, from, next) {
              next((vm) => vm.$router.replace(from.fullPath));
            },
            render: (h) => h(),
          },
        },
        // 页面重定向
        {
          path: "redirect/:route*",
          name: "redirect",
          hidden: true,
          component: {
            beforeRouteEnter(to, from, next) {
              next((vm) => vm.$router.replace(JSON.parse(from.params.route)));
            },
            render: (h) => h(),
          },
        },
      ],
    },
  ];
  let addRouters = {
    path: "/index",
    name: "index",
    redirect: { name: "home" },
    component: loadView("Index"),
    meta: {
      auth: true,
    },
    children: [],
  };
  let lastRouter = [
    {
      path: "/:pathMatch(.*)*",
      component: loadView("error/404"),
      meta: {
        icon: "",
        title: "404",
        auth: false,
        isDisable: true,
        isCache: false,
      },
    },
    {
      path: "/:pathMatch(.*)",
      component: loadView("error/404"),
      meta: {
        icon: "",
        title: "404",
        auth: false,
        isDisable: true,
        isCache: false,
      },
    }
  ];
  setItemRouter(addRouters.children, dataList, "");
  return [...rootRouter, addRouters, ...lastRouter];
};
const setItemRouter = (routerList, dataList, baseUrl) => {
  for (let data of dataList) {
    let path = baseUrl + "/" + data.path;
    let route = {
      path: path,
      name: data.path,
      redirect: "",
      component: loadView(data.component || "Index"),
      meta: {
        icon: "",
        title: data.title,
        auth: true,
        isSideMenu: !!data.isSideMenu,
        isCache: !data.isCache,
      },
      children: [],
    };
    if (data.children && data.children.length > 0) {
      route.redirect = { name: data.children[0].path };
      routerList.push(route);
      setItemRouter(routerList, data.children, path);
    } else {
      routerList.push(route);
    }
  }
};
export const loadView = (view) => {
  // 路由懒加载
  // return (resolve) => require([`@/views/${view}`], resolve);
  return () => Promise.resolve(require(`@/views/${view}`).default);
};

4、*router:

routes.js:需要配置的白名单,即包括登录、注册、404等页面

index.js:动态路由处理,由vue2中的addRoutes()改为vue3中的addRoute(),核心代码:

store
        .dispatch("store/user/getUserInfo")
        .then((resp) => {
          resp.forEach((route) => {
            router.addRoute(route);
            router.options.routes.push(route);
          });
          next({ ...to, replace: true });
          NProgress.done();
        })
        .catch((error) => {
          console.log(error);
        });

5.页面浏览量:

其余的就简单多了。您只需要处理菜单即可。该项目已经编写了一个无限级别的菜单演示。

vue3-pc:vue3+vue-router4+vuex+axios+元素加

vue3-h5:vue3+vue-router4+vuex+axios+vant主要是基于PC架的移动端改编。我不做太多移动工作,所以如果有人有时间,可以fork并提交代码。当前版本可以正常播放。

. . .

相关推荐

额外说明

contains shards using both inmem and tsi1 indexes. 重构索引 influx

问题: 删除infludx表measurement时出错 参考: 记一次influxdb内存高耗的追踪 - 墨天轮 influxdb删除错误DB contains shards using both inmem and tsi1 indexes._宇宙全

额外说明

win10添加ip地址映射

  路径:  C:\WINDOWS\System32\drivers\etc hosts文件: 如果有权限问题: https://jingyan.baidu.com/article/624e7459b194f134e8ba5a8e.html    

额外说明

Flutter移动应用开发实战——请求服务端数据

QQ 1274510382 Wechat JNZ_aming 商业联盟 QQ群538250800 技术搞事 QQ群599020441 解决方案 QQ群152889761 加入我们 QQ群649347320 共享学习 QQ群674240731 纪年科技am

额外说明

输入source ~/.bashrc 报错dircolors\lesspipe: command not found解决方法

问题 输入 source ~/.bashrc 如下报错 Command 'lesspipe' is available in the following places * /bin/lesspipe * /usr/bin/lesspipe The c

额外说明

高等数学之曲率

 a代表改变角度 s代表弧长 圆的曲率              

额外说明

python字典:揭秘无序元素的奥秘之旅

前言 在编程中,数据的组织和管理是一个关键的方面。对于处理和操作数据,Python 提供了许多强大的数据结构,其中最常用和灵活的之一就是字典(Dictionary)。 无论您是初学者还是有经验的开发者,掌握字典的基本知识是非常重要的。本博客将带您进入字典

额外说明

全网详细解决Client does not support authentication protocol requested by server;consider upgrading Mysql c

文章目录 1. 复现错误 2. 分析错误 3. 解决错误 1. 复现错误 今天使用Navicat准备连接mysql,如下图所示: 点击连接测试按钮时,却报出如下错误: 即1251- Client does not support authenticati

额外说明

《Cesium 进阶知识点》- el-select 列表打开后,点击Cesium.Viewer场景无法自动关闭

前提 el-select属性 popper-append-to-body 必须 为 false。这样初始化的列表 el-select-dropdown 才在 el-select下; 目前测试,仅对 Cesium.Viewer 生成的 canvas 点击时

额外说明

MongoDB【部署 03】Windows系统安装mongodb并设置用户名密码(无需安装mongosh)及SpringBoot集成报错 Command failed with error 18

Windows系统安装mongodb并设置用户名密码 1.下载安装 1.1 下载 1.2 安装 2.设置用户名密码 2.1 找到配置文件 2.2 设置用户名密码 2.2.1 Navicat操作 2.2.2 修改配置文件 2.3 验证 3.SpringBo

额外说明

C++ 引用!他是坤坤,也是鸡哥

C++学习笔记子夜的星的主页 -座右铭:太阳升起,一人死去,但功德不减。 目录 一、简介2. 报价 1. 引用的概念2. 引用的声明3. 引文特征 Ⅰ.引用必须在定义时初始化二.一个变量可以有多个引用三.一旦引用引用了一个实体,它就不能引用其他实体。 4

ads via 小工具