vue3实战(通用后台管理系统)问题总结

npm install less vue-router element-plus -s
elementplus

路由引入组件第二种写法:

使用动态的import( )语法(推荐使用)(路由懒加载)

  component:()=>import('路径')component:()=>import('@/views/Main.vue')

打包之后的文件将会异常的大,需要加载的内容过多时间过长,出现长时间的白屏,不利于用户体验,运用懒加载就可以将页面进行划分,需要的时候加载页面,可以有效的分担首页所承担的加载压力,减少首页加载用时。

filter函数

filter用于对数组进行过滤。
filter() 方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。

const hasChildren=computed(()=>list.filter(item=>item.children));
过滤掉没有children的数组元素

v-if和v-for

vue2中v-for优先;vue3中v-if优先

is

component组件是一个动态组件,跟随:is里的变量动态显示加载组件
使用场景:适用于组件会动态变化的场景,如新闻类型可能是视频、图片、文字,在遍历渲染新闻列表时,根据新闻类型的不同,渲染不同的组件。

<component class="icons" :is="item.icon"></component>

new URL()

在这里插入图片描述

mokejs

生成随机数据,拦截 Ajax 请求
mokejs官网

getCurrentInstance()

在Vue3中,getCurrentInstance()可以用来获取当前组件实例

let { proxy } = getCurrentInstance();

getCurrentInstance只能在setup或生命周期钩子中使用。

1.在onMunted生命周期中打印getCurrentInstance

2.定义一个test方法,通过click事件触发方法

封装axios

  1. 拦截器
    api/request.js
import axios from "axios";
import {} from 'element-plus';
const server=axios.create();
// 添加请求拦截器
server.interceptors.request.use(function (config) {// 在发送请求之前做些什么return config;}, function (error) {// 对请求错误做些什么return Promise.reject(error);});// 添加响应拦截器
server.interceptors.response.use((res)=>{const {code,data,msg}=res.data;if(code===200){return data;}else{const NETWORK_ERROR="网络错误,请稍后重试";ElMessage.error(msg|| NETWORK_ERROR);return Promise.reject(new Error(msg|| NETWORK_ERROR));}}
);function request(options){options.method=options.method||"get";return server(options);
}
export default request;
  1. 统一管理axios
    api/api.js
// 整个项目api的统一管理import request  from "./request";
export default {// 获取首页左侧的表格数据getTableData(){return request({url:"/api/home/getTableData",method:"get"})},};
  1. main.ts配置全局api
import api from './api/api';
// 全局api
app.config.globalProperties.$api = api;
  1. 使用
import {unMounted,getCurrentInstance} from 'vue'
const {proxy} = getCurrentInstance();
const getTableData=()=>{const data = proxy.$api.getTableData();tableData.value=data.tableData;
}

echarts

生成图表
安装: npm install echarts -D
文档

Object.keys()

  1. 遍历对象(必须包含属性和方法的对象);
  2. 返回对象中每一项key的数组(遍历一个对象,返回一个全是key的数组)

用法:1.如果对象是一个对象,会返回对象的属性名组成的数组;

Object.keys()
let obj={a:1, b:2, c:3}
Object.keys(obj) // ['a', 'b', 'c']

2.如果对象是一个数组或字符串,则返回索引组成的数组

Object.values()和Object.keys() 相反

map

map用法详解

返回值错误:


返回的是{}里面的的值,不是[{},{},{}];
2.正确写法:

在这里插入图片描述在这里插入图片描述

监听图表页面

const observer=ref();// 监听页面的变化observer.value=new ResizeObserver(()=>{oneEchart.resize();twoEchart.resize();threeEchart.resize();});if(proxy.$refs.echart){observer.value.observe(proxy.$refs.echart);}

resizeobserve

搜索功能

搜索

分页

前后端分页

scope.row

理解Element的scope.row

vue插槽的scope.row

confirm、alert、prompt

confirm、alert、prompt区别

element plus

官网

nextTick

问题:点击编辑后,再点击添加用户后表单里的信息变成了编辑用户的信息(本来是没有值的)
在这里插入图片描述
在这里插入图片描述
原因:

// 编辑
const handleEdit=(val)=>{dialogFormVisible.value = true;action.value=1;// 赋值(表单的值设置为当前行的值)// 当dialogFormVisible.value = true后弹出对话框表单才会出现,(表单在对话框里)// 异步非常快,会把Object.assign(form,{...val,addr:val.address})当成初始值//导致关闭对话框再次打开后显示Object.assign(form,{...val,addr:val.address})的值Object.assign(form,{...val,addr:val.address})
}

nextTick详解

  解决方式1nextTick(()=>{//不要忘记先引入nextTickObject.assign(form,{...val,addr:val.address})})解决方式2setTimeout(()=>{Object.assign(form,{...val,addr:val.address})},100)

useRouter和useRoute

两者区别
区别

router.push

vue3跳转路由5中方式

json.stringfy和json.parmars

相关文章1

相关文章2

vite的glob

在这里插入图片描述

动态生成路由

    // 动态生成路由function addMenu(router){const menuList=state.value.menuList;//根据登陆身份拿到对应的菜单列表const module=import.meta.glob("../views/**/*.vue");//批量const routeArr=[];menuList.forEach(item=>{if(item.children){item.children.forEach(val=>{let url=`../views/${val.url}.vue`;val.component=module[url];routeArr.push(val);});}else{let url=`../views/${item.url}.vue`;item.component=module[url];routeArr.push(item);}})routeArr.forEach(item=>{state.value.routerList.push(router.addRoute("main",item));});};

glob

vite:glob批量引入文件

多账号登陆问题

不是管理员账号,但能访问到mall页面
在这里插入图片描述

    // 动态生成路由function addMenu(router){const menuList=state.value.menuList;//根据登陆身份拿到对应的菜单列表const module=import.meta.glob("../views/**/*.vue");//批量const routeArr=[];menuList.forEach(item=>{if(item.children){item.children.forEach(val=>{let url=`../views/${val.url}.vue`;val.component=module[url];routeArr.push(val);});}else{let url=`../views/${item.url}.vue`;item.component=module[url];routeArr.push(item);}});// 解决多种账号登陆bugstate.value.routerList=[];let routes=router.getRoutes();//拿到所有路由routes.forEach(val=>{if(val.name==='main'||val.name==='login'){return //不做处理}else{router.removeRoute(val.name);}});routeArr.forEach(item=>{state.value.routerList.push(router.addRoute("main",item));});};

解决登录后刷新页面消失的路由问题

对pinia的stores/index.js下的state进行持续化存储

    //   state持久化存储watch(state,(newObj)=>{if(!newObj.token) return ;localStorage.setItem("store",JSON.stringify(newObj));},{deep:true})

main.js

import router from './router/index';
import { useAllDataStore } from './stores';
const store = useAllDataStore();//放到app.use(pinia)后
store.addMenu(router,"refresh")//传递路由并传类别//这一步要在使用路由前
app.use(router)

退出登录

const handleLoginOut=()=>{store.clean()router.push('/login');
}

stores/index.js

export const useAllDataStore = defineStore("allData",()=>{/****/function clean(){state.value.routerList.forEach(item=>{if(item) item();//删除(console.log(item)后得到是一个removeRoute删除路由)});// 重置state.value=initState();// 删除本地缓存localStorage.removeItem("store");}/*****/return {state,updateMenuList,addMenu,clean}
})

路由守卫

相关文章1

相关文章2

// 路由守卫
function isRoute(to){let res=router.getRoutes();let resFil=res.filter(item=>item.path===to.path);//拿到要去往的路由return resFil.length>0;//判断是否在路由列表中
}
router.beforeEach((to,from)=>{if(to.path!=='/login'&&!store.state.token){// next('/login');return {name:'login'}}if(!isRoute(to)){// next('/404');return {name:'404'}}
})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/50554.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PLSQL 无法使用normal模式登录ORACLE

1、确认用户具有连接数据库的权限。可以通过查询DBA_SYS_PRIVS来确认用户是否具有CREATE SESSION权限。 SELECT * FROM DBA_SYS_PRIVS WHERE PRIVILEGE CREATE SESSION AND GRANTEE 用户名; 2、需要DBA授予相应的权限&#xff1a;GRANT CREATE SESSION TO 用户名; 3、测试…

《昇思25天学习打卡营第25天|第28天》

今天是打卡的第二十八天&#xff0c;实践应用篇中的计算机视觉中Vision Transformer图像分类。 从Vision Transformer&#xff08;ViT&#xff09;简介开始了解&#xff0c;模型结构&#xff0c;模型特点&#xff0c;实验的环境准备和数据读取&#xff0c;模型解析&#xff08…

容器对比虚拟机有哪些不足?

引言 在当今的云计算和微服务架构中&#xff0c;容器技术已成为不可或缺的一部分。它以其轻量级、高效和快速部署的特性&#xff0c;赢得了广大开发者和运维人员的青睐。然而&#xff0c;正如任何技术都有其两面性&#xff0c;容器技术也不例外。本文将对容器技术在安全性、隔离…

深入探索PHP框架:Symfony框架全面解析

1. 引言 在现代Web开发领域&#xff0c;PHP作为一种广泛使用的服务器端脚本语言&#xff0c;其框架的选择对于项目的成功至关重要。PHP框架不仅能够提高开发效率&#xff0c;还能确保代码的质量和可维护性。本文将深入探讨Symfony框架&#xff0c;这是一个功能强大且灵活的PHP…

Teamcenter RAC开发,创建Item的两种方式

1、如果描述不必填&#xff0c;采用胖客户端的创建方式 newItem itemType.create(newItemId, "", targetTypeComp.getTypeName(), item_name, // "test1", null, null2、如果描述必填&#xff0c;则需要采用SOA的创…

用PyPDF2库对pdf文件进行操作

目录 基本原理与基础语句PdfReader类PdfWriter类文件写入 对pdf文件进行插入操作对pdf文件进行删除页操作对pdf文件进行分割操作 基本原理与基础语句 PdfReader类 pdf_file PyPDF2.PdfReader(filenmae) 通过PdfReader函数可以读取pdf文件并生成一个PdfReader类 该类具有以下…

C++11中的右值引用以及移动构造等

目录 一、右值引用 1.左值引用和右值引用 2.左值引用与右值引用比较 3.右值引用使用场景和意义 1️⃣ 传返回值 2️⃣ STL中的应用 4.完美转发 模板中的&& 万能引用&#xff08;引用折叠&#xff09; 二、 新的类功能 1.默认成员函数 2.类成员变量初始化 3.…

线程池学习(一)

1.线程池有什么作用 降低资源消耗&#xff1a;通过池化技术重复利⽤已创建的线程&#xff0c;降低线程创建和销毁造成的损耗。 提⾼响应速度&#xff1a;任务到达时&#xff0c;⽆需等待线程创建即可⽴即执⾏。 提⾼线程的可管理性&#xff1a;线程是稀缺资源&#xff0c;如果…

ProxmoxPVE虚拟化平台--安装PVE虚拟机

Proxmox 虚拟机 Proxmox是一个基于Debian Linux和KVM的虚拟化平台&#xff0c;‌它提供了虚拟化的环境&#xff0c;‌允许用户在同一台物理机上运行多个虚拟机。‌Proxmox虚拟环境&#xff08;‌PVE&#xff09;‌是一个开源项目&#xff0c;‌由Proxmox Server Solutions Gmb…

【复读EffectiveC++23】条款23:宁以 non-member、non-friend替换member函数

条款23&#xff1a;宁以 non-member、non-friend替换member函数 这是C设计的一个基本原则&#xff0c;主要目的是减少面向对象设计中的耦合&#xff0c;提高软件的内聚性和可复用性。non-member、non-friend函数可以不受类内部实现的影响&#xff0c;因此更加灵活和可复用。 …

Power Tower

Problem - D - Codeforces 牛客和codeforce都有 递归处理l,r&#xff0c;终点是lr && mod1 用扩展欧拉定理 // Problem: D. Power Tower // Contest: Codeforces - Codeforces Round 454 (Div. 1, based on Technocup 2018 Elimination Round 4) // URL: https://c…

学习HTML、CSS和JavaScript的完整路线指南

第一步&#xff1a;理解基础概念 HTML基础 HTML简介和结构 什么是HTML&#xff1f;它在Web开发中的角色。HTML文档的基本结构&#xff1a;<!DOCTYPE>, <html>, <head>, <body>等标签的作用和使用方法。 常用HTML元素 文本相关&#xff1a;段落 <p&g…

【Socket 编程】应用层自定义协议与序列化

文章目录 再谈协议序列化和反序列化理解 read、write、recv、send 和 tcp 为什么支持全双工自定义协议网络计算器序列化和反序列化 再谈协议 协议就是约定&#xff0c;协议的内容就是约定好的某种结构化数据。比如&#xff0c;我们要实现一个网络版的计算器&#xff0c;客户端…

【logstash】logstash使用多个子配置文件

这里有个误区在pipelines.yml中写conf.d/*&#xff0c;实测会有问题&#xff0c;不同的filter处理逻辑会复用。 现在有两个从kafka采集日志的配置文件&#xff1a;from_kafka1.conf&#xff0c;from_kafka2.conf 修改pipelines.yml配置文件 config/pipelines.yml- pipeline.i…

关于P2P(点对点)

P2P 是一种客户端与客户端之间&#xff0c;点对点连接的技术&#xff0c;在早前的客户端都是公网IP&#xff0c;没有NAT的情况下&#xff0c;P2P是较为容易实现的。 但现在的P2P&#xff0c;实现上面会略微有一些复杂&#xff1a;需要采取UDP打洞的技术&#xff0c;但UDP打出来…

asp.net mvc 三层架构开发商城系统需要前台页面代完善

一般会后端开发&#xff0c;都不太想写前台界面&#xff0c;这套系统做完本来想开源&#xff0c;需要前台界面&#xff0c;后台已开发&#xff0c;有需求的朋友&#xff0c;可以开发个前端界面完善一下&#xff0c;有的话可以私聊发给我啊

python_使用多进程来处理数据写入Excel文件_multiprocessing.Process

python_使用多进程来处理数据写入Excel文件 优势&#xff1a;与多线程相比&#xff0c;多进程写入速度要更快&#xff0c;12万多行数据处理用时3.52秒&#xff0c;比多进程快了1秒左右。 import pandas as pd from io import BytesIO import multiprocessing import time impor…

Spring源码-AOP

1、spring aop和aspectJ什么关系&#xff1f; aop是编程思想&#xff0c;spring aop被aspectJ都是aop思想的具体实现。spring aop为了不重复造轮子&#xff0c;通过一定的取舍选取了aspectJ中适合自己的注解。spring初期版本的aop只支持通过实现aop接口的方式来实现切面增强&a…

Nginx 最常用的命令

目录 一、Nginx 安装与配置 1.1 下载与安装 1.2 配置文件 二、Nginx 基本操作 2.1 启动与停止 2.2 重启与重新加载 三、日志管理 3.1 访问日志 3.2 错误日志 四、虚拟主机管理 4.1 配置虚拟主机 4.2 管理虚拟主机 五、性能优化 5.1 缓存配置 5.2 连接优化 Nginx…

Redis(三)

1. java连接redis java提高连接redis的方式jedis. 我们需要遵循jedis协议。 引入依赖 <!--引入java连接redis的驱动--><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>4.3.1</version&g…