Vue3快速入门【一】

一、Vue脚手架

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

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

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

1.1、Vite简介

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

Vite 意在提供开箱即用的配置,同时它的 插件 APIJavaScript 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代码段"
	}
  }

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

東三城

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值