Vue3项目实战

目录

一、项目准备

二、基础语法应用

2.1、mixin应用

2.2、网络请求

2.3、显示与隐藏

2.4、编程式路由跳转

2.5、下载资料

2.6、调用方法

2.7、监听路由变化

2.8、pinia应用

(1)存储token(user.js)

(2)全选全不选案例(car.js)

一、项目准备

下载:

cnpm i unplugin-auto-import -D   //setup 语法糖插件

npm i -D @types/node                //解决vite不能@问题

npm install element-plus --save  //组件库

npm install -D unplugin-vue-components  //按需引入组件库

npm install less
npm install less-loader
npm install @originjs/vite-plugin-global-style

在vite.config.js中

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import globalStyle from '@originjs/vite-plugin-global-style'
// cnpm i unplugin-auto-import -D setup 语法糖插件
import AutoImport from 'unplugin-auto-import/vite'
import path from 'path'
export default defineConfig({plugins: [vue(),AutoImport({imports: ['vue', 'vue-router']}),globalStyle({sourcePath:'./src/assets/css',lessEnabled:true}),
],resolve: {// 配置路径别名(解决vite不能@问题)  npm i -D @types/nodealias: {"@": path.join(__dirname, 'src'),"#": path.join(__dirname, 'types')}}
})

组件库地址: 设计 | Element Plus

二、基础语法应用

2.1、mixin应用

在v-for循环的时候,后端返回的状态是数字,而前端需要将它回显成对应的汉字,可以使用mixin将这快封装起来。

import courseType from "../../mixins/courseType.js";
let { courseTypeFn } = courseType();

mixin文件夹下的js代码:

export default function () {let courseTypeFn = (type) => {let val = ''switch (type) {case 1:val = '初级';break;case 2:val = '中级';break;case 3:val = '高级';break;default:val = ''}return val;}return { courseTypeFn, }
}

视图应用:{{ courseTypeFn(item.courseLevel) }}

methods里面也可以判断状态:

2.2、网络请求

拿到请求后,先定义数据类型,在onBeforeMount生命周期里面去获取数据。

// api
import {getSliders,getFirstCategorys,
} from "@/api/api.js";
import { onBeforeMount } from "vue";
// 轮播图数据
let sliderList = ref([]);
// 一级分类数据
let firstList = ref([]);
// 生命周期
onBeforeMount(() => {getSliders().then((res) => {sliderList.value = res.data.list;});getFirstCategorys().then((res) => {firstList.value = res.data.list;});
});

2.3、显示与隐藏

<div class="active-r" v-if="isShow"></div>
// 定义数据
let isShow = ref(false);
// 事件
const mouseHover = () => {isShow.value = true;);
};

2.4、编程式路由跳转

import { useRouter } from "vue-router";
const router = useRouter();
//方法里跳转指定页面
const GoJump = (id) => {router.push({path: "/about/details",query: { id },});
};

接收参数

import { useRoute } from "vue-router";
let route = useRoute();
courseId: route.query.id,

2.5、下载资料

获取后端返回的文件流,自己组装出一个文件全称,在页面创建a标签,实现下载功能。

const download = (item) => {downloadAttachment({courseId: item.courseId,attachmentId: item.id,}).then((res) => {//后端返回的是文件流const blob = new Blob([res]);let fileName = item.attachmentName;let fileUrl = item.attachmentUrl;const extName = fileUrl.substring(fileUrl.lastIndexOf(".")); //.giffileName = fileName + extName; //kkkk.gif// 前端创建a标签进行新窗口的打开const link = document.createElement("a");link.download = fileName;link.target = "_black";link.style.display = "none";link.href = URL.createObjectURL(blob);document.body.appendChild(link);link.click();URL.revokeObjectURL(link.href);document.body.removeChild(link);});
};

或者可以直接 window.open(info.url);

2.6、调用方法

const pageSize = ref(8);
const getlist = () => {mostNew({pageNum: pageNum.value,pageSize: pageSize.value,}).then((res) => {newList.value = res.data.pageInfo.list;total.value = res.data.pageInfo.total;});
};
const handleSizeChange = (val) => {pageSize.value = val;getlist();
};

2.7、监听路由变化

// 头部监听路由变化
watch(() => router.currentRoute.value.name,(toPath) => {if (toPath == "Home") {currentId.value = 1;} else if (toPath == "About") {currentId.value = 2;} else if (toPath == "Shop") {currentId.value = 3;}},{ immediate: true }
);

2.8、pinia应用

下载持久化存储插件:cnpm i pinia-plugin-persist

文件夹的index.js

import {createPinia} from 'pinia'
import piniaPluginPersist from 'pinia-plugin-persist'
const store=createPinia()
store.use(piniaPluginPersist)
export default store

(1)存储token(user.js)

import { defineStore } from 'pinia'
export const useUserStore = defineStore({id: 'user',state: () => {return {token: ''}},actions: {setToken(token) {this.token = token}},// 开启数据缓存persist: {enabled: true,strategies: [{key: 'xiao_user',storage: localStorage}]}
})

页面使用:

// pinia
import { useUserStore } from "../stores/user.js";
const userStore = useUserStore();userStore.setToken(res.data.accessToken);

(2)全选全不选案例(car.js)

解构

import { defineStore } from 'pinia'
export const useCartStore = defineStore({id: 'cart',state: () => {return {cartList: [],//购物车数量select: [],//选中的商品id}},getters: {isChecked() {return this.select.length == this.cartList.length}},actions: {addCart(list) {list.forEach(v => {v['check'] = truethis.select.push(v.id)})this.cartList = list},// 全选all() {this.select = this.cartList.map(v => {v['check'] = truereturn v.id})},// 全不选unAll() {this.cartList.forEach(v => {v['check'] = false})this.select = []},//单个选itemChecked(index) {let id = this.cartList[index].id;let idx = this.select.indexOf(id);//检查它里面有没有if (idx > -1) {this.cartList[index].check = false;this.select.splice(idx, 1);//有} else {this.cartList[index].check = true;this.select.push(id);//没有}}},
})

页面使用:

import { storeToRefs } from "pinia";
import { useCartStore } from "../stores/car.js";
let cartStore = useCartStore();
let { cartList, isChecked } = storeToRefs(cartStore);
onBeforeMount(() => {getShopCarList().then((res) => {firstList.value = res.data.list;});cartStore.addCart(firstList.value);console.log(cartStore.cartList);
});
const checkAll = () => {if (isChecked.value) {cartStore.unAll(); // 不选} else {cartStore.all(); // 全选}
};

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

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

相关文章

[JavaWeb]【十三】web后端开发-原理篇

目录 一、SpringBoot配置优先级 1.1 配置优先级比较 1.2 java系统属性和命令行参数 1.3 打包运行jar 1.4 综合优先级​编辑 二、Bean管理 2.1 获取bean 2.2 bean作用域 2.2.1 五种作用域 2.2.2 配置作用域 2.3 第三方bean 2.3.1 编写公共配置类 三、SpringBoot原理 …

mybatis-plus如何使用枚举类来实现性别和标签的数字带描述

文章目录 目录 文章目录 前言 一、环境准备 二、使用步骤 一 实体类 二 枚举类 三 持久层 四 控制层 总结 前言 枚举是一种表示一组有限可能取值的数据类型。它具有以下几个好处&#xff1a; 易于理解和维护&#xff1a;枚举提供了一种清晰明了的方式来表示一组具体的取值&a…

【Linux操作系统】线程的基本知识和创建--循环创建多个子线程

本篇文章主要介绍了线程的概念和作用&#xff0c;线程三级映射的实现&#xff0c;创建线程的方法&#xff08;讲解pthread_self和pthread_create函数&#xff09;&#xff0c;循环创建多个子线程为例子&#xff0c;同时分析线程之间的全局变量的共享问题&#xff0c;希望可以帮…

Redis笔记——(狂神说)待续

Nosql概述 为什么要用NoSql&#xff1f; 1、单机mysql的年代&#xff1a;90年代&#xff0c;网站访问量小&#xff0c;很多使用静态网页html写的&#xff0c;服务器没压力。 当时瓶颈是&#xff1a;1)数据量太大一个机器放不下。2)数据的索引(BTree)&#xff0c;一个机器内存也…

Git最简入门

文章目录 几个基本概念版本控制Git的由来分布式 vs 集中式GitSVN Git、GitHub、GitLab、GitWeb、Gitee的区别 动手进行版本控制初始化Git使用情景一&#xff1a;开发新项目使用情景二&#xff1a;在已有项目上开发设置代理 参考 几个基本概念 版本控制 在工作学习中&#xff…

「Python|音视频处理|环境准备」如何在Windows系统下安装并配置音视频处理工具FFmpeg

本文主要介绍如何在Windows系统下安装并配置音视频处理工具FFmpeg&#xff0c;方便使用python进行音视频相关的下载或编辑处理。 文章目录 一、下载软件二、解压并配置三、验证安装 一、下载软件 首先要去 ffmpeg官网 下载软件包 由于上面直接下载的按钮是.tar.xz格式的。为了…

基于 Alpine 环境源码构建 alibaba-tengine(阿里巴巴)的 Docker 镜像

About Alpine&#xff08;简介&#xff09; Alpine Linux 是一款极其轻量级的 Linux 发行版&#xff0c;基于 busybox&#xff0c;多被当做 Docker 镜像的底包&#xff08;基础镜像&#xff09;&#xff0c;在使用容器时或多或少都会接触到此系统&#xff0c;本篇文章我们以该镜…

Pydev·离线git包

Pydev离线git包 1.下载离线git包&#xff1a;eclipse.egit.repository-4.4.0.201606070830-r.zip 2.将解压后目录&#xff1a;eclipse.egit.repository-4.4.0.201606070830-r\plugins下的jar文件放到 ide\eclipse\plugins目录下 3.重启pydevIDE 百度搜索站长工具&#xff1a;h…

Spring集成【MyBatis】和【PageHelper分页插件】整合---详细介绍

一&#xff0c;spring集成Mybatis的概念 Spring 整合 MyBatis 是将 MyBatis 数据访问框架与 Spring 框架进行集成&#xff0c;以实现更便捷的开发和管理。在集成过程中&#xff0c;Spring 提供了许多特性和功能&#xff0c;如依赖注入、声明式事务管理、AOP 等 它所带来给我们的…

校对的力量:当专业遇上细节,文字焕发新生

在这个信息爆炸的时代&#xff0c;文字成为了我们传达思想、展现形象的重要工具。从新闻稿、政府材料到商业文档&#xff0c;其背后的准确性和专业性往往决定了信息传递的效果。而保证这一切的&#xff0c;就是细致入微的校对工作。 1.错别字与校对&#xff1a;细节之美 错别字…

开源全球地理空间数据可视化框架——Cesium学习(2023.8.21)

Cesium学习 2023.8.21 1、Cesium简介1.1 Github上的Cesium 2、Cesium下载安装使用2.1 方式一&#xff1a;页面在线引用2.2 方式二&#xff1a;页面离线使用2.3 方式三&#xff1a;完整项目使用 3、CesiumJS学习教程&#xff08;快速上手 API文档&#xff09;3、Cesium官方示例…

vue离线缓存资源文件

本文章主要是解决大文件,实时请求资源浪费网络资源的问题 从而有效的将解决用户体验的问题 话不多说上才艺 ⬇️⬇️⬇️⬇️⬇️⬇️⬇️ 找到项目中的 index.html 文件,并在 html 标签中加入 manifest"manifest.appcache" 安装 appcache-manifest 包 npm ins…

c++ qt--信号与槽(二) (第四部分)

c qt–信号与槽(二) &#xff08;第四部分&#xff09; 信号与槽的关系 1.一对一 2.一对多 3.多对一 4.多对多 还可以进行传递 信号->信号->槽 一个信号控制多个槽的例子&#xff08;通过水平滑块控制两个组件&#xff09; 1.应用的组件 注意这里最下面的组件进行…

【Qt学习】06:事件与事件过滤器

OVERVIEW 事件与事件过滤器一、事件1.鼠标事件创建子类MyLabel重写鼠标事件提升Label控件为MyLabel 2.定时器事件timerEventQTimer 3.事件分发器&#xff08;event函数&#xff09;event函数重写event函数深入 二、事件过滤器1.事件过滤器2.事件处理的五个层次 事件与事件过滤器…

Tomcat和Servlet基础知识的讲解(JavaEE初阶系列16)

目录 前言&#xff1a; 1.Tomcat 1.1Tomcat是什么 1.2下载安装 2.Servlet 2.1什么是Servlet 2.2使用Servlet来编写一个“hello world” 1.2.1创建项目&#xff08;Maven&#xff09; 1.2.2引入依赖&#xff08;Servlet&#xff09; 1.2.3创建目录&#xff08;webapp&a…

VR法治警示教育:情景式课堂增强教育效果

VR法治警示教育平台是一款基于虚拟现实技术的在线教育平台&#xff0c;旨在通过模拟真实场景和互动体验&#xff0c;向公众普及法律知识&#xff0c;提高公民的法律意识和素养。该平台采用先进的虚拟现实技术&#xff0c;将用户带入一个逼真的仿真环境&#xff0c;让用户身临其…

python systemrdl 使用实例

今天来看一个具体实例&#xff0c;上一篇传送门&#xff1a;python SystemRDL 包介绍_Bug_Killer_Master的博客-CSDN博客 通常来说&#xff0c;我们验证过程用到的情况大多都是需要提取reg field的路径以及reset 值等信息&#xff0c;所以比较常见的一种方法就是先把rdl compil…

简析SCTP开发指南

目录 前言一、SCTP基本概念二、SCTP开发步骤1. **环境配置**&#xff1a;2. **建立Socket**&#xff1a;3. **绑定和监听**&#xff1a;4. **接收和发送数据**&#xff1a;5. **关闭连接**&#xff1a; 三、 C语言实现SCTP3.1SCTP客户端代码&#xff1a;3.2 SCTP服务器端代码&a…

识别图片中的文字

前言 PearOCR 是一款免费无限制网页版文字识别工具。 优点如下&#xff1a; 免费&#xff1a;完全免费&#xff0c;没有任何次数、大小限制&#xff0c;可以无限使用&#xff1b; 安全&#xff1a;全部数据本地运算&#xff0c;所有图片均不会被上传&#xff1b; 智能&#xf…

SQL注入之HTTP头部注入

文章目录 cookie注入练习获取数据库名称获取版本号 base64注入练习获取数据库名称获取版本号 user-agent注入练习获取数据库名称获取版本号 cookie注入练习 向服务器传参三大基本方法:GPC GET方法&#xff0c;参数在URL中 POST&#xff0c;参数在body中 COOKIE&#xff0c;参数…