浅析Vue3 实战笔记(一)

news2024/9/21 0:41:02

本文是结合实践中和学习技术文章总结出来的笔记(个人使用),如有雷同纯属正常((✿◠‿◠))

喜欢的话点个赞,谢谢! 有问题欢迎指正!!

前面已经讲了基本的Vue生命周期和入门知识,本篇开始使用Vite构建一个demo

1. 创建项目

1.1. 初始化项目

使用Vite初始化项目

yarn create vite my-vue-vite 

初始化之后会得到一个这样的目录

现在已经是一个完整的项目了,,可以启动,但是我们这里还需要先配置一下Eslint方便后续写代码的校验

1.2. 配置eslint

安装Eslint

yarn add eslint -D

本来是打算用Eslint@9来做配置,由于eslint@9版本实在是配置太麻烦 这里我建议安装指定版本:(丢入package.json文件 yarn 安装即可)

  "eslint": "^8.57.0",
  "eslint-config-standard": "^17.1.0",
  "eslint-plugin-import": "^2.29.1",
  "eslint-plugin-n": "^16.6.2",
  "eslint-plugin-promise": "^6.1.1",
  "eslint-plugin-vue": "^9.24.1",
  "typescript-eslint": "^7.6.0",

根目录下新增一个.eslintrc.cjs文件: 这是我个人的一些简单配置

module.exports = {
    env: {
        browser: true,
        es2021: true
    },

    extends: [
        'plugin:vue/vue3-strongly-recommended',
        'standard'
    ],
    parserOptions: {
        ecmaVersion: 12,
        parser: '@typescript-eslint/parser',
        sourceType: 'module'
    },

    plugins: [
        'vue',
        '@typescript-eslint'
    ],
    rules: {
        'vue/multi-word-component-names': 'off',
        indent: ['error', 4] // 设置为4个空格
    },

    ignorePatterns: [
        'node_modules/',
        'dist/',
        '.commitlintrc.js'
    ]
}

配置完成以后需要在Vscode设置一下才能自动保持格式化,如下图所示:

首选项=>设置=>搜索Eslint=>Eslint › Format: Enable 设置打钩

这样我们ctrl +s 保存的时候就会自动按照Eslint自动格式化代码了

2. 项目目录结构设计

本文将按照以下目录结构进行开发,后续章节的webpack配置也是基于此目录结构。
请先按照以下内容将目录搭建好,方便后续操作

├─ /public              <--静态目录
|  ├─ /images           <--图片目录
|  |  └─ logo.png       <--菜单logo
|  ├─ favicon.ico       <--项目图标
├─ /src                 <--开发目录
|  ├─ /api              <--API公用目录
|  |  └─ index.ts   
|  ├─ /components        <--公用组件目录
|  ├─ /store            <--Pinia状态管理目录
|  |  ├─ /models        <--Pinia models目录
|  |  ├─ index.ts       <--Pinia Stroe
|  ├─ /router           <--路由目录
|  |  ├─ index.ts       <--路由配置文件
|  ├─ /views            <--页面目录
|  |  ├─ /Home          <--Home目录
|  |  ├─ ├─index.vue    <--Home页面代码
|  ├─ App.vue           <--App文件
|  ├─ main.ts           <--主入口
|  ├─ vite-env.d.ts    
├─ .gitignore 
├─ .eslintrc.cjs        <--eslint配置文件
├─ index.html           <--主入口html文件
├─ README.md            <--项目说明
├─ tsconfig.json        <--ts配置文件
├─ vite.config.ts       <--vite配置文件
└─ package.json         <--依赖配置文件

这种目录结构设计,将页面、请求api、状态管理、路由分别建立独立的目录,并且设置了components等公用目录,方便多人协作开发及后续维护。

3. 配置vite.config.ts

vite.config.ts文件与我们平常配置webpack文件长得差不多,根据官方文档按需配置即可

3.1. 设置别名

在我们开发项目的时候为了方便写引入路径和防止路径太长写错,我们都会设置@别名来代替无穷尽../../这种写法

安装@types/node模块 否则引入path会提示找不到模块

yarn add @types/node --save-dev

修改vite.config.ts文件:

export default defineConfig({
    .....
    resolve: {
        alias: {
            '@': path.resolve(__dirname, 'src')
        }
    },
})

配置tsconfig.json文件:

 "compilerOptions": {
   .......
    //src路径
    "baseUrl": "./", // 解析非相对模块的基地址,默认是当前目录
    "paths": { //路径映射,相对于baseUrl
      "@/*": ["src/*"] 
    },
 }
3.2. 配置代理

开发项目跨域请求通常是不能直接请求的,需要进行跨域设置,在模块化开发中通常都是使用代理来解决跨域的问题

修改vite.config.ts文件: 这里我的本地服务器是4000端口所以我配置了localhost:4000,大家可以自行更改

export default defineConfig({
  ......
    server: {
        // 代理域名
        proxy: {
            '/api': {
                target: 'http://localhost:4000',
                rewrite: (path) => path.replace(/^\/api/, '')
            }
        }
    }
})

4. 开始开发

打开App.vue删除不需要的代码

<script setup lang="ts">
</script>
<template>
  <div>App</div>
</template>
<style scoped></style>

4.1. 配置路由

安装vue-router

yarn add vue-router@4

修改router/index.ts

import { createRouter, createWebHashHistory } from 'vue-router'
const router = createRouter({
    history: createWebHashHistory(), // 路由模式
    routes: [
        {
            path: '/home',
            name: 'home',
            component: () => import('../views/Home/index.vue')
        },
        {
            path: '/test',
            name: 'test',
            component: () => import('../views/Test/index.vue')
        }
    ]
})
export default router

在main.ts中注册:

import { createApp } from 'vue'
import App from './App.vue'
import router from './router/index'

createApp(App).use(router).mount('#app')

App.vue中使用:

<script setup lang="ts">
</script>
<template>
  <!-- 路由页面入口 -->
  <router-view />
</template>
<style scoped></style>

页面显示效果:

4.2. 引入Ant Design Vue 2.X

安装

yarn add ant-design-vue@next

在main.ts注册Antd

import { createApp } from 'vue'
import App from './App.vue'
import router from './router/index'
import 'ant-design-vue/dist/reset.css'

createApp(App)
    .use(router)
    .mount('#app')

在Home页面中引入button组件

views/Home/index.vue

<script setup lang='ts'>
import { Button } from 'ant-design-vue'
</script>
<template>
  <div>Home</div>
  <Button type="primary">
    button按钮
  </Button>
</template>
<style lang='less' scoped>
</style>

4.3. 布局样式

这里的布局UI我们采用ant-design-vue的layout组件(可点击跳转官网查阅)

新建layout目录:src/layout/index.vue

<script lang="ts" setup>
import { ref } from 'vue'
import logo from '../../public/images/logo.svg'
import { MenuListType } from '@/types/Home'
const collapsed = ref<boolean>(false)
const MenusList = ref<MenuListType[]>([
    {
        name: '首页',
        path: '#/',
        children: [],
        icon: 'HomeOutlined',
        id: '1'
    },
    {
        name: '测试页面',
        path: '#/test',
        children: [],
        icon: 'WindowsOutlined',
        id: '2'
    }

])
const selectedKeys = ref(['1'])
</script>
<template>
  <a-layout style="min-height: 100vh">
    <a-layout-sider
      v-model:collapsed="collapsed"
      collapsible
    >
      <div class="logo">
        <img
          class="logoimg"
          :src="logo"
          alt=""
        >
        Vite Demo
      </div>
      <a-menu
        theme="dark"
        v-model:selectedKeys="selectedKeys"
        mode="inline"
      >
        <a-menu-item
          v-for="item in MenusList"
          :key="item.id"
        >
          <component :is="item?.icon" />
          <a
            class="menus_text"
            :href="item.path"
          >{{ item.name }}</a>
        </a-menu-item>
      </a-menu>
    </a-layout-sider>
    <a-layout>
      <a-layout-header style="background: #fff; padding: 0" />
      <a-layout-content style="margin: 0 16px">
        <a-breadcrumb style="margin: 16px 0">
          <a-breadcrumb-item>User</a-breadcrumb-item>
          <a-breadcrumb-item>Bill</a-breadcrumb-item>
        </a-breadcrumb>
        <div :style="{ padding: '24px', background: '#fff', minHeight: '360px' }">
          <router-view />
        </div>
      </a-layout-content>
      <a-layout-footer style="text-align: center">
        Ant Design ©2018 Created by Ant UED
      </a-layout-footer>
    </a-layout>
  </a-layout>
</template>

<style>
.logo {
  height: 32px;
  margin: 16px;
  font-size: 20px !important;
  line-height: 32px;
  /* background: rgba(255, 255, 255, 0.3); */
  color: #fff;

  .logoimg {
    width: 30px;
    height: 30px;
  }
}
.menus_text {
    margin-left: 10px;
}

</style>

显示效果如图,此时我们发现菜单上的icon没有显示,我们还需要去main.ts中引入

修改main.ts文件

import { createApp } from 'vue'
import App from './App.vue'
import router from './router/index'
import Antd from 'ant-design-vue'
import 'ant-design-vue/dist/reset.css'
import * as antdIcons from '@ant-design/icons-vue'

// 创建对象
const app = createApp(App)
// 将atn-desing Iocn全部添加进来
Object.keys(antdIcons).forEach((key: any) => {
    app.component(key, antdIcons[key as keyof typeof antdIcons])
})
app.config.globalProperties.$antdIcons = antdIcons

app.use(router)
    .use(Antd)
    .mount('#app')

展示效果如图,图标已经出来了:

总结:本篇初步的项目初始化部署就已经搭建完成了,下一篇我们将引入antd的组件表单配合echats做一个首页,欢迎查阅下一篇浅析Vue3 实战笔记(二),本篇就到这里.谢谢

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

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

相关文章

简单了解java中的异常

异常 1、异常的概述 1.1、概述 异常就是程序出现了不正常的情况&#xff0c;程序在执行过程中&#xff0c;数据导致程序不正常&#xff0c;最终导致JVM的非正常停止。语句错误不算在异常体系中。 1.2、异常的存在形式 异常有类型之分&#xff0c;比如我们比较熟悉的数组越…

【C++11】常见的c++11新特性(一)

文章目录 1. C11 简介2. 常见的c11特性3.统一的列表初始化3.1initializer_list 4. decltype与auto4.1decltype与auto的区别 5.nullptr6.右值引用和移动语义6.1左值和右值6.1.1左值的特点6.1.2右值的特点6.1.3右值的进一步分类 6.2左值引用和右值引用以及区别6.2.1左值引用6.2.2…

两台电脑通过网线直连共享数据(超详细)- 我的实践记录

原文链接 按照原文的操作&#xff0c;成功通过直连网线连接了两台windows电脑并共享传输数据。 ping不通可能是防火墙没关闭导致的&#xff0c;但是完全关闭防火墙又不安全。 那么有没有不关闭防火墙&#xff0c;能够上网&#xff0c;又能直连另一台电脑呢&#xff1f; 我们…

tokenization(一)概述

文章目录 背景基于词&#xff08;Word-based&#xff09;基于字符&#xff08;Character-based&#xff09;子词词元化&#xff08;Subword tokenization&#xff09; 背景 tokenization是包括大语言模型在内所有自然语言处理的任务的基础步骤&#xff0c;其目标是将文本数据转…

数据结构:二叉树的实现

目录 二叉树的遍历方式 前序遍历&#xff1a; 中序遍历&#xff1a; 后序遍历&#xff1a; 二叉树的基本结构和功能 基本结构&#xff1a; 基本功能&#xff1a; 二叉树功能的实现思路 二叉树功能的实现 1、构建一个二叉树 2、二叉树的销毁 3、计算二叉树里的节点个数 4、得…

音频数据上的会话情感分析

情感分析&#xff0c;也被称为观点挖掘&#xff0c;是自然语言处理(NLP)中一个流行的任务,因为它有着广泛的工业应用。在专门将自然语言处理技术应用于文本数据的背景下,主要目标是训练出一个能够将给定文本分类到不同情感类别的模型。下图给出了情感分类器的高级概述。 例如,三…

从零开始理解AdaBoost算法:设计思路与算法流程(二)【权值更新与加权表决、数学公式】

设计思路 AdaBoost算法属于Boosting算法家族中的一种&#xff0c;其基本思路是将多个弱分类器组合成一个强分类器。 “强分类器”是指一个分类准确率较高的模型“弱分类器”则是指分类准确率略高于随机猜测的简单模型。 AdaBoost的核心思想是通过 加权 的方式逐步提高分类器…

Tomcat源码解析(八):一个请求的执行流程(附Tomcat整体总结)

Tomcat源码系列文章 Tomcat源码解析(一)&#xff1a;Tomcat整体架构 Tomcat源码解析(二)&#xff1a;Bootstrap和Catalina Tomcat源码解析(三)&#xff1a;LifeCycle生命周期管理 Tomcat源码解析(四)&#xff1a;StandardServer和StandardService Tomcat源码解析(五)&…

keda-P0460. 潜水员

可达信奥 - 登录 - 可达信奥https://kedaoi.cn/p/P0460 代码思路&#xff1a; 01背包DP。 思路也是比较经典的&#xff0c;就是看用这个水缸的最小值小&#xff0c;还是不用这个水缸的最小值小。但是这里涉及到一个初始化的问题&#xff0c;因为要求最小所以初始化理应…

使用NetAssist网络调试助手在单台计算机上配置TCP服务器和客户端

要使用NetAssist网络调试助手在同一台计算机上配置一个实例作为服务器&#xff08;server&#xff09;和另一个实例作为客户端&#xff08;client&#xff09;&#xff0c;可以按照以下步骤进行操作&#xff1a; 前提条件 确保已经安装NetAssist网络调试助手&#xff0c;并了…

streamlit:如何快速构建一个应用,不会前端也能写出好看的界面

通过本文你可以了解到&#xff1a; 如何安装streamlit&#xff0c;运行起来第一个demo熟悉streamlit的基本语法&#xff0c;常用的一些组件使用streamlit库构建应用 大模型学习参考&#xff1a; 大模型学习资料整理&#xff1a;如何从0到1学习大模型&#xff0c;搭建个人或企业…

鞠小云张霖浩闪耀北京广播电视台春晚发布会,豪门姐弟感爆棚

昨日&#xff0c;2025年北京广播电视台“追梦春晚”全国海选发布会在杭州举行&#xff0c;中国内地青年女演员鞠小云同人气幕后张霖浩&#xff0c;受主办方盛情邀请出席本次活动。从现场流露出的照片中可以看出&#xff0c;鞠小云一袭白色长裙灵动温婉素雅&#xff0c;而张霖浩…

springboot与flowable(1):介绍、Flowable-ui使用

一、工作流引擎使用场景 工作流在企业管理系统中是高频使用的功能&#xff0c;一个最常见的例子是请假加班申请与审批的过程。事实上&#xff0c;工作流引擎能支持的业务场景远远不止单据审批&#xff0c;几乎所有涉及到业务流转、多人按流程完成工作的场景背后都可以通过工作流…

Vue3【二】 VSCode需要安装的Vue语法插件

VSCode需要安装的 适配Vue3的插件 Vue-Official插件安装

A股所有公司ZL申请与创新绩效分析(2000-2022年)

数据简介&#xff1a;专利是创新成果的主要载体&#xff0c;专利所包含的技术、经济、法律等信息主要通过结构化专利专利文献著录项的形式加以呈现。专利申请与创新绩效已成为衡量上市公司竞争力的重要指标。目前&#xff0c;各国ZSCQ管理部门开发管理的开放式平台是获取ZL数据…

PyQt5 多进程 多任务 多线程实现进度条功能 无边框 含源码

概述&#xff1a; 在项目 中我们常遇到&#xff0c;大量计算或者加载数据时&#xff0c;需要用到多线程&#xff0c;此时只能等待&#xff0c;我们这个时间需要添加一下进度条&#xff0c;告诉用户当前需要等待&#xff0c;这时间就需要用到多线程和等待进度条&#xff1b; 效…

【STM32】GPIO输出(江科大)

一、GPIO简介 1.GPIO&#xff1a;通用输入输出口 2.可配置为8种输入输出模式 3.引脚电平&#xff1a;0-3.3V&#xff08;输出最大3.3V&#xff09;&#xff0c;部分引脚可容忍5V&#xff08;输入&#xff0c;有FT&#xff09; 4.输出模式下&#xff0c;可控制端口输出高低电平…

94、二叉树的迭代遍历

实现对二叉树的前后序非递归遍历 题解&#xff1a; 递归的实现就是&#xff1a;递去&#xff0c;归来。每一次递归调用都会把函数的局部变量、参数值和返回地址等压入调用栈中&#xff0c;然后递归返回的时候&#xff0c;从栈顶弹出上一次递归的各项参数&#xff0c;所以这就是…

MySQL系列-安装配置使用说明(MAC版本)

1、前言 本文将介绍MySQL的安装配置以及基本语法操作说明 环境&#xff1a;mac 版本&#xff1a;MySQL 8.0.28 之前电脑安装卸载过&#xff0c;后面在装的时候遇到一些问题&#xff0c;用了四五天才解决&#xff0c;主要是参考 https://blog.csdn.net/zz00008888/article/deta…

IPv6 自动配置流程图

IPv6 自动配置流程图 IPv6 自动配置生命周期 Mark