Vue3快速入门【一】

news2024/12/28 23:03:58

Vue3快速入门

    • 一、Vue脚手架
      • 1.1、Vite简介
      • 1.2、创建项目
    • 二、更换Vue模板支持工具
    • 三、项目相关命令解析
    • 四、生命周期钩子函数
    • 五、ref方法的几种使用方式
      • 5.1、ref方法(操作基本类型数据)
      • 5.2、ref方法(操作复杂类型数据)
      • 5.3、ref方法获取标签
    • 六、reacttive方法和toRefs方法
    • 七、setup语法糖
    • 八、watch属性和watchEffect属性
    • 九、Computed属性
    • vscode代码片段设置

一、Vue脚手架

Vue3官方文档地址:https://v3.cn.vuejs.org/

以前的官方脚手架@vue-cli也可以用,但这里推荐一个更轻快的脚手架Vite

脚手架网址:https://vitejs.cn/

1.1、Vite简介

Vite(法语意为 “快速的”,发音 /vit/,发音同 “veet”)是一种新型前端构建工具,能够显著提升前端开发体验。它主要由两部分组成:

  • 一个开发服务器,它基于 原生 ES 模块 提供了 丰富的内建功能,如速度快到惊人的 模块热更新(HMR)。
  • 一套构建指令,它使用 Rollup 打包你的代码,并且它是预配置的,可输出用于生产环境的高度优化过的静态资源。

Vite 意在提供开箱即用的配置,同时它的 插件 API 和 JavaScript API 带来了高度的可扩展性,并有完整的类型支持。

你可以在 为什么选 Vite 中了解更多关于项目的设计初衷。

1.2、创建项目

创建项目命令:

npm init vite

在这里插入图片描述

创建出来的项目中并没有node_modules文件夹,所以按照上面的指引,进入项目文件夹后,执行npm install

然后执行 npm run dev
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、更换Vue模板支持工具

以前我们用的Vue2模板支持的VScode扩展是Vetur(禁用即可),使用TS+Vue3建议换成更加友好的Volar。

全称为: Vue Language Features (Volar)
在这里插入图片描述

三、项目相关命令解析

package.json中提供了三个命令:

"scripts": {
    "dev": "vite --host",    
    "build": "vue-tsc --noEmit && vite build",   
    "preview": "vite preview"   // 启动提供预览的服务器(这里预览的是打包的)
},
npm run dev --host   // 开发环境下的启动
npm run build   // 打包项目,项目目录多一个dist文件夹
npm run preview   // 启动提供预览的服务器(这里预览的是打包的)

四、生命周期钩子函数

官方文档:https://v3.cn.vuejs.org/api/composition-api.html

components文件夹下创建01-App.vue文件:

main.ts文件修改成:

import { createApp } from 'vue'
import App from './components/01-App.vue'

01-App.vue文件中:

<template>
  <div>这是vue3</div>
</template>
<script setup lang="ts">
import { onBeforeMount, onMounted } from "vue"
console.log("执行了setup")
onBeforeMount(() => {
  console.log("执行了onBeforeMount");
});
onMounted(() => {
  console.log("执行了onMounted");
})
</script>
<style scoped>

</style>

五、ref方法的几种使用方式

5.1、ref方法(操作基本类型数据)

02-App.vue文件中:

<template>
  <div>{{ num }}</div>
  <button @click="hdClick">加一</button>
</template>
<script setup lang="ts">

let num: number = 30
const hdClick = () => {
  num++
  console.log(num)
}
</script>
<style scoped>

</style>

在这里插入图片描述

但只是上面的写法并没有双向绑定,num并不是响应式数据。Vue3提供了ref方法

<template>
  <div>{{ num }}</div>
  <button @click="hdClick">加一</button>
</template>
<script setup lang="ts">
import { ref } from "vue"
let num = ref(30)
console.log(num);  // 直接访问是一个被包装过的数据
const hdClick = () => {
  num.value++;   // 通过.value才能操作到数据。
                 // 但模板上只需要{{num}}不需要,因为Vue3在模板编译阶段会把响应式数据num直接通过.value去获取。所以模板不需要改变
  console.log(num)
}
</script>
<style scoped>

</style>
</script>

在这里插入图片描述

5.2、ref方法(操作复杂类型数据)

<template>
  <div>{{ obj.num }}</div>
  <button @click="obj.num++">加一</button>
  <button @click="hdclick">减一</button>
</template>
<script setup lang='ts'>
import { ref } from 'vue';
let obj = ref({
  num: 66
})
const hdclick = () => {
  obj.value.num--
}
</script>
<style scoped>

</style>

5.3、ref方法获取标签

在模板上通过ref绑定标签,setup中通过ref();来获取

<template>
  <p ref="op">你我山前没相见山后别相逢</p>
</template>
<script setup lang='ts'>
import { ref, onMounted, nextTick } from 'vue'
let op = ref() // 这里拿到的是ref绑定为op的节点数据
console.log("setup", op.value); // setup生命周期还没有节点挂载
onMounted(() => {
  console.log("onMounted", op.value);  // 挂载后就可以通过.value拿到节点
})
nextTick(() => {
  console.log("nextTick", op.value);  // 下一次dom更新后会触发的回调(只会触发1次)
})
</script>
<style scoped>

</style>

在这里插入图片描述

六、reacttive方法和toRefs方法

reactive用来实现复杂数据类型的响应式

<template>
  <div>{{ obj.num }}</div>
</template>
<script setup lang='ts'>
import { reactive, ref } from 'vue';
// 用ref实现基础数据类型的响应式,reactive实现复杂数据类型的响应式
// 如果ref传入的是一个复杂数据,那么最后ref方法内部会调用到reactive
let obj = reactive({
  num: 99
})
console.log('reactive', obj)
let obj1 = ref({
  num: 66
})
console.log('ref', obj1.value)
// obj1.value和obj一样
</script>
<style scoped>

</style>
</script>

在这里插入图片描述

toRefs方法用来把reactive()处理过的数据处理成响应式结构出来:

<template>
  <div>{{ num }}</div>
  <button @click="hdclick">+</button>
</template>
<script setup lang='ts'>
import { reactive, toRefs } from 'vue';

// 解构数据,需要通过toRefs方法处理,解构出来的数据出来的才是响应式数据
// 解构出来需要.value的形式来操作
let { num } = toRefs(reactive({
  num: 66
}))
const hdclick = () => {
  num.value++
}
</script>
<style scoped>

</style>

七、setup语法糖

一直在使用setup语法糖

<template>
  <div></div>
</template>
<script setup lang='ts'>

</script>
<style scoped>

</style>

八、watch属性和watchEffect属性

watch属性和watchEffect属性都可以用于监听,watch写法上支持一个或者多个监听源,这些监听源必须只能是getter/effect函数,ref数据,reactive对象,或者是数组类型

<template>
  <div>ref-{{ num }}</div>
  <button @click="num++">+</button>
  <div>toRefs-{{ objNum }}</div>
  <button @click="objNum--">-</button>
  <div>reactive-{{ obj.numObj }}</div>
  <button @click="obj.numObj++">+</button>
</template>

<script setup lang='ts'>
import { reactive, ref, watch, toRefs, watchEffect } from 'vue';
let num = ref(30)
// watch(要监听的响应式数据,数据更新时候执行的回调函数)
watch(num, (newV, oldV) => {
  console.log('ref', newV, oldV)
})

let { objNum } = toRefs(reactive({
  objNum: 10
}))
watch(objNum, (newV, oldV) => {
  console.log('toRefs', newV, oldV)
})

let obj = reactive({
  numObj: 99
})
watch(() => obj.numObj, (newV, oldV) => {
  console.log('reactive格式一', newV, oldV)
})
/* 或者下面这种格式 */
watch([() => obj.numObj], (newVal, oldVal) => {
  console.log('reactive格式二', newVal, oldVal);
})

/* watchEffect自带立即监听的效果 */
watchEffect(() => {
  // 当这个函数里面用到的值发生变化的时候就会 自动执行这个函数
  console.log('watchEffect', obj.numObj);
});

</script>

<style scoped>

</style>

在这里插入图片描述

九、Computed属性

计算属性作用和以前一样,格式也换成调用方法:

<template>
  <div>{{ dbNum }}</div>
  <button @click="num++">+</button>

  <div>{{ dbObj }}</div>
  <button @click="obj.objNum++">+</button>
</template>

<script setup lang='ts'>
import { ref, computed, reactive } from 'vue';
let num = ref(1)
let dbNum = computed(() => {
  return num.value * 2
})

let obj = reactive({
  objNum: 10
})
let dbObj = computed(() => {
  return obj.objNum * 2;
})
</script>

<style scoped>

</style>

vscode代码片段设置

在这里插入图片描述
在这里插入图片描述
输入prefix中代码即可一键生成代码块
完整版:

{
	"demo": {
	  "prefix": "vue3",
	  "body": [
		"<template>",
		"\t<div>",
		"\t\t",
		"\t</div>",
		"</template>",
		"",
		"<script lang='ts'>",
		"import { defineComponent } from \"Vue\"",
		"export default defineComponent({",
		"\tsetup () {",
		"\t\t$0",
		"\t\treturn {\n",
		" ",
		"\t\t}",
		"\t}",
		"})",
		"</script>",
		" ",
		"<style lang = \"less\" scoped>",
		"\t",
		"</style>"
	  ],
	  "description": "自定义的一个vue代码段"
	}
  }

简写版:

{
	"demo": {
	  "prefix": "setup",
	  "body": [
		"<template>",
		"\t<div>",
		"\t\t",
		"\t</div>",
		"</template>",
		"",
		"<script lang='ts' setup>",
		"import {  } from \"Vue\"",
		"\t$0",
		"</script>",
		" ",
		"<style lang = \"less\" scoped>",
		"\t",
		"</style>"
	  ],
	  "description": "自定义的一个vue代码段"
	}
  }

如有不足,请多指教,
未完待续,持续更新!
大家一起进步!

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

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

相关文章

开发人员 ONLYOFFICE 文档 v7.3:API 与文档生成器更新

随着版本 7.3 新功能的发布&#xff0c;我们也对编辑器、插件以及文档生成器的 API 进行了更新。在下方了解更多详情。 增强的 WOPI 支持 从现在开始&#xff0c;您可在 WOPI 集成中使用二进制格式&#xff0c;如 doc、ppt 以及 xls。我们现已实现了相应方案&#xff0c;其中包…

ClickHouse 合并树表引擎 MergeTree 索引与数据存储方式

目录 1. 一级索引 1.1 稀疏索引 1.2 索引粒度 1.3 索引数据的生成规则 1.4 索引的查询过程 2. 二级索引 2.1 granularity 与 index_granularity 2.2 跳数索引的生成规则

阿里6面,成功唬住面试官拿了27K,软件测试面试也没有传说中那么难吧....

阿里的面试挺独特&#xff0c;每轮面试都没有 HR 约时间&#xff0c;一般是晚上 8 点左右面试官来一个电话&#xff0c;问是否能面试&#xff0c;能的话开始面&#xff0c;不能就约一个其它时间。 全程 6 面&#xff0c;前五面技术面&#xff0c;电话面试&#xff0c;最后一面…

KEITHLEY吉时利2410数字源表

产品概览 Keithley 2410 高压源表专为需要紧密耦合源和测量的测试应用而设计。Keithly 2410 提供精密电压和电流源以及测量功能。它既是高度稳定的直流电源&#xff0c;又是真正的仪器级 5-1/2 数字万用表。电源特性包括低噪声、精度和回读。万用表功能包括高重复性和低噪声。…

《真象还原》读书笔记——第三章 完善MBR(3.5 硬盘)

3.5 硬盘介绍 3.5.2 硬盘工作原理 柱面-磁头-扇区 磁道的编号从0 开始&#xff0c;相同编号的此道组成的管状区域就是柱面。 盘面和磁头一一对应&#xff0c;所以用磁头号表示盘面&#xff0c;磁头编号从上到下从0开始。 扇区编号与盘面和磁道不同&#xff0c;各磁道内的扇区都…

选择万德L2接口需要遵循什么原则?

万德L2接口是一种可以让程序拥有查询股票相关数据的应用查询编程接口&#xff0c;通过这个数据接口&#xff0c;可以直接调用相应的数据&#xff0c;而不用进行额外的编程工作&#xff0c;甚至不需要理解其中的工作机制&#xff0c;是十分方便快捷的一种数据接口。 但是市场上…

操作系统基础---多线程

文章目录操作系统基础---多线程1.为何引入线程程序并发的时空开销线程的设计思路线程的状态和线程控制块TCB2.线程与进程的比较3.线程的实现⭐1.内核支持线程KST2.用户级线程3.组合方式操作系统基础—多线程 1.为何引入线程 利用传统的进程概念和设计方法已经难以设计出适合于…

方向导数与梯度下降

文章目录方向角与方向余弦方向角方向余弦方向导数定义性质梯度下降梯度下降法&#xff08;Gradient descent&#xff09;是一个一阶最优化算法&#xff0c;通常也称为最速下降法。 要使用梯度下降法找到一个函数的局部极小值&#xff0c;必须向函数上当前点对应梯度&#xff08…

学习数据库第一天

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、数据库的开启和关闭二、数据库的登录 添加数据库以及表1.登录数据库2.查看数据库三 数据表前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#x…

spring cloud脚手架快速开发 微服务架构 JAVA敏捷开发框架源码

核心技术采用Spring Cloud Alibaba、SpringBoot、Mybatis、Seata、Sentinel、RabbitMQ、FastDFS/MinIO、SkyWalking等主要框架和中间件。 私信了解更多&#xff01; 功能模块&#xff1a; 1、租户管理&#xff1a;运营人员管理所有的租户创建 2、工作台&#xff1a;普通用户…

支持分布式部署的主流方式 - Session 持久化到 Redis

1.为什么要将 Session 存储在 Redis 中如果我们不将 Session 存储在 MySQL 或者 Redis 中, 那么做出来的项目就只能支持单机部署, 不支持分布式部署. 因为之前我们只是将 Session 存储在当前电脑的内存里面. 当张三去登录的时候, 将 Session 信息存储在 A 服务器, 这个时候负载…

码上【call,apply,bind】的手写

一、call &#xff08;1&#xff09;官方用法 call() 方法使用一个指定的 this 值和单独给出的一个或多个参数来调用一个函数。 语法&#xff1a;function.call(要绑定的this值&#xff0c;参数&#xff0c;参数&#xff0c;…)。不一定这些参数都需要&#xff0c;这些参数都…

寿险业务系统异常处理方案

我们的系统使用的java语言开发&#xff0c;基于Spring框架搭建的业务中台&#xff0c;在讨论业务系统异常处理策略之前&#xff0c;先把java的异常机制进行简单说明。 一、Java的异常机制 1.Java异常分类 【Error】是系统错误或者编译错误&#xff0c;常见的虚拟机运行错误、…

2023,考个软考中级证书稳妥深圳入户,5月考试8月办入户

最新消息&#xff01;最新消息&#xff01;最新消息&#xff01; 2023年2月8日&#xff0c;深圳市发展和改革委员会深圳市公安局深圳市人力资源和社会保障局关于印发《深圳市积分入户办法》的最新通知↓ 来源《深圳市发展和改革委员会》 该积分入户将于2023年2月15日正式实施&…

C++与Lua交互实例 -- 矩阵的加减乘除(版本一)

C与Lua交互实例 – 矩阵的加减乘除&#xff08;版本一&#xff09; 关于lua中封装的类模板以及相关知识可参考以下链接&#xff1a; https://ufgnix0802.blog.csdn.net/article/details/128854786 https://ufgnix0802.blog.csdn.net/article/details/128827673 https://ufgnix0…

Python深度学习实战PyQt5窗口切换的堆叠布局示例详解

本文以堆叠窗口控件为例&#xff0c;详细介绍堆叠布局的界面设计和程序实现过程&#xff0c;通过案例带小白创建一个典型的堆叠布局多窗口切换程序软件项目中经常需要多种不同的图形界面&#xff0c;以适应不同的任务场景。选项卡控件&#xff08;QTackedWidget&#xff09;通过…

[Java 进阶] synchronized 与 ReentrantLock的区别

祝一切顺利~ 文章目录synchronized 与 ReentrantLock的区别synchronized 与 ReentrantLock的区别 1.ReentrantLock的锁是公平锁,synchronized是非公平锁.(公平锁是指当锁被释放时,由等待时间最长的线程获取锁.非公平锁是锁被释放时,所有线程不论等待时间长短,都一起去竞争) 2.…

小白系列Vite-Vue3-TypeScript:009-屏幕适配

上一篇我们介绍了ViteVue3TypeScript项目中mockjs的安装和配置。本篇我们来介绍屏幕适配方案&#xff0c;简单说来就是要最大程度上保证我们的界面在各种各样的终端设备上显示正常。通用的屏幕适配方案有两种&#xff1a;① 基于rem 适配&#xff08;推荐&#xff0c;也是本篇要…

线下沙龙|从VUCA到BANI,找到你的“第二曲线”

冷战之后&#xff0c;VUCA盛行&#xff0c;世界已复杂到无可言表&#xff1b;然而&#xff0c;我们正在拼命地理解和适应“VUCA时代”&#xff0c;却又被迷迷糊糊、跌跌撞撞地推进了“BANI时代”。 未来之路在何方&#xff1f;在脚下&#xff0c;却不知该如何去迈&#xff1f; …

elasticsearch使用painless的一些简单例子

文章目录1、背景2、准备数据2.1 mapping2.2 插入数据3、例子3.1 (update)更新文档 id1 的文档&#xff0c;将 age 加 2岁3.2 (update_by_query)如果 province 是北京的话&#xff0c;就将 age 减少1岁3.3 (ctx.op)如果张三的年龄小于20岁就不处理&#xff0c;否则就删除这个文档…