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,一经查实,立即删除!

相关文章

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

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

深入探索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的创…

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…

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…

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

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

关于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;有的话可以私聊发给我啊

Redis(三)

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

Android Framework 之AMS

它管理了系统的四大组件:Activity、Service、ContentProvider、Broadcast。 它除了管理四大组件外&#xff0c;同时也负责管理和调度所有的进程 AMS相关目录结构 AMS代码主要在下面几个目录(AndroidQ上AMS相关部分功能移到了wm下)&#xff1a; frameworks/base/core/java/andro…

记录|LabVIEW从0开始

目录 前言一、表达式节点和公式节点二、脚本与公式2.1 公式 三、Excel表格3.1 位置3.2 案例&#xff1a;波形值存入Excel表中3.3 案例&#xff1a;行写入&#xff0c;列写入 四、时间格式化4.1 获取当前时间4.2 对当前时间进行格式化 更新时间 前言 参考视频&#xff1a; LabVI…

【STL】之 vector 使用方法及模拟实现

前言&#xff1a; 本文主要讲在C STL库中vector容器的使用方法和底层的模拟实现~ 成员变量的定义&#xff1a; 对于vector容器&#xff0c;我们首先采用三个成员变量去进行定义&#xff0c;分别是&#xff1a; private:iterator _start; // 指向数据块的开始iterator _finish…

React类组件生命周期与this关键字

类组件生命周期 参考链接 一图胜千言&#xff08;不常用的生命周期函数已隐藏&#xff09; 代码&#xff1a; //CC1.js import { Component } from "react";export default class CC1 extends Component {constructor(props) {super(props);console.log("con…

【Vue3】watchEffect

【Vue3】watchEffect 背景简介开发环境开发步骤及源码 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努力学习奋斗的日子。本文…

C++初学(7)

7.1、字符串 字符串是存储在内存的连续字节中的一系列字符。C处理字符串的方式有两种&#xff0c;第一种是来自C语言&#xff0c;常被称为C风格字符串&#xff0c;另一种则是基于string类库的方法。 存储在连续字节中的一系列字符意味着可以将字符存储在char数组中&#xff0…

微信小程序开发 快速学习 这篇就够了

目录 一、配置篇 &#xff08;1&#xff09;官网链接&#xff1a; &#xff08;2&#xff09;项目分析 &#xff08;3&#xff09;调试器 &#xff08;4&#xff09;预览体验 &#xff08;5&#xff09;配置文件 &#xff08;6&#xff09;配置pages &#xff08;7&…

CSRF Token 原理

CSRF 攻击 CSRF 攻击成功的关键是&#xff0c;恶意网站让浏览器自动发起一个请求&#xff0c;这个请求会自动携带 cookie &#xff0c;正常网站拿到 cookie 后会认为这是正常用户&#xff0c;就允许请求。 防范 如果在请求中加一个字段&#xff08;CSRF Token&#xff09;&am…

鸿蒙开发—黑马云音乐之Music页面

目录 1.外层容器效果 2.信息区-发光效果 3.信息区-内容布局 4.播放列表布局 5.播放列表动态化 6.模拟器运行并配置权限 效果&#xff1a; 1.外层容器效果 Entry Component export struct MuiscPage {build() {Column() {// 信息区域Column() {}.width(100%)// .backgroun…