Vue3项目实战

这篇具有很好参考价值的文章主要介绍了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/node
    alias: {
      "@": 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里面也可以判断状态:

Vue3项目实战,vue.js,前端,javascript

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(".")); //.gif
    fileName = 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'] = true
                this.select.push(v.id)
            })
            this.cartList = list
        },
        // 全选
        all() {
            this.select = this.cartList.map(v => {
                v['check'] = true
                return 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);//没有
            }
        }
    },
})

页面使用:文章来源地址https://www.toymoban.com/news/detail-671197.html

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(); // 全选
  }
};

到了这里,关于Vue3项目实战的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue3 antd项目实战——table表格的自定义筛选【纯前端filters过滤、自定义筛选table表格数据】

    文章内容 文章链接 vue3 antd table 表格的基础搭建 https://blog.csdn.net/XSL_HR/article/details/128072745 ant design vue 组件库的引入与使用 https://blog.csdn.net/XSL_HR/article/details/127396384 在 后台管理系统 中,我们需要 对大量的数据进行展示、处理和操作 ,table表格也因此无处不在。而 ant design

    2024年01月25日
    浏览(54)
  • 【Vue H5项目实战】从0到1的自助点餐系统—— 搭建脚手架(Vue3.2 + Vite + TS + Vant + Pinia + Node.js)

    H5 项目基于 Web 技术,可以在智能手机、平板电脑等移动设备上的浏览器中运行,无需下载和安装任何应用程序,且H5 项目的代码和资源可以集中在服务器端进行管理,只需更新服务器上的代码,即可让所有顾客访问到最新的系统版本。 本系列将以肯德基自助点餐页面为模板

    2024年02月13日
    浏览(60)
  • 前端技术Html,Css,JavaScript,Vue3

    1.基本标签 2.文本格式化 3.链接 4.图片 5.无序列表 6.有序列表 7.表格 8.表单 1.选择器 2.文本和字体 3.链接 4.隐藏 5.定位position 6.浮动 7.对齐 8.图像 1.输出 2.函数 3.常用事件 4.DOM 5.改变Html 6.DOM 元素 (节点) 尾部创建新的 HTML 元素 (节点) - appendChild() 头部创建新的 HTML 元素 (节点)

    2024年02月13日
    浏览(50)
  • 【前端技术】Vue3 01:初识 Vue.js

    Vue 可以说是非常流行了,至少在国内是这样,他是个轻量级的 JavaScript 框架,非常适合构建大型和中小型的 Web 应用程序,如果想和前端打交道,应该绕不过这个框架吧。 目录 1 Vue.js 介绍 2  IDE 选择 2.1 vscode 2.2 WebStorm 2.3 Eclipse 3  创建 Vue 应用 3.1 本地脚手架创建 ① 安装

    2024年02月02日
    浏览(60)
  • 前端(四)——vue.js、vue、vue2、vue3

    😊博主:小猫娃来啦 😊文章核心: vue.js、vue、vue2、vue3从全局到局部 Vue.js是一款流行的JavaScript框架 vue,vue2,vue3都是vue.js的不同版本。 Vue:Vue.js的第一个版本,也称为Vue 1.x。它于2014年首次发布,并获得了广泛的应用和认可。 Vue2:Vue.js的第二个版本,也称为Vue 2.x。它在Vu

    2024年02月12日
    浏览(75)
  • vue3项目+TypeScript前端项目—— vue3搭建项目+eslint+husky

    今天来带大家从0开始搭建一个vue3版本的后台管理系统。一个项目要有统一的规范,需要使用eslint+stylelint+prettier来对我们的代码质量做检测和修复,需要使用husky来做commit拦截,需要使用commitlint来统一提交规范,需要使用preinstall来统一包管理工具。 下面我们就用这一套规范

    2024年02月22日
    浏览(81)
  • 前端HTML、CSS、JS、VUE3 汇总

    学习https://developer.mozilla.org/zh-CN/docs/Learn/CSS 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 使用VS Code运行前端代码 在VS Code上安装前端插件 正在更新中~ ✨ 提示:这里可以添加本文要记录的大概内容: 学习路线 知识定位 HTML基础 标签、表格、表单、

    2024年02月13日
    浏览(49)
  • 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

    2024年02月11日
    浏览(61)
  • JavaScript - 判断当前时间是否在指定区间内,例如:9:00~12:00(检查当前时间是否处于规定的两个时间段范围内),适用于 vue.js / uniapp / 微信小程序等前端项目

    例如,您想知道当前时间是否处于 9:00 ~ 12:00 时间区间内,然后根据这个判断进而实现业务逻辑。 如下示例所示, 本文提供一个函数,您只需要传入 2 个时间区间,便可得出当前时间是否在该时间区间范围内: 您可以一键复制,直接粘贴到您的项目中。 您只需要传入开始时

    2024年02月16日
    浏览(60)
  • 【前端vue升级】vue2+js+elementUI升级为vue3+ts+elementUI plus

    gogo code 是一个基于 AST (源代码的抽象语法结构树状表现形式)的 JavaScript/Typescript/HTML 代码转换工具,可以用它来构建一个代码转换程序来帮助自动化完成如框架升级、代码重构、多平台转换等工作。 当前 GoGoCode 支持解析和操作如下类型的代码: ○JavaScript(JSX) ○Typescript

    2024年02月12日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包