Vue 3 组件基础与模板语法详解
title: Vue 3 组件基础与模板语法详解
date: 2024/5/24 16:31:13
updated: 2024/5/24 16:31:13
categories:
- 前端开发
tags:
- Vue3特性
- CompositionAPI
- Teleport
- Suspense
- Vue3安装
- 组件基础
- 模板语法
Vue 3 简介
1. Vue 3 的新特性
Vue 3引入了许多新的特性,以提高框架的性能和可维护性。下面是一些主要的新特性:
- Composition API:这是Vue 3中最大的变化之一,它提供了一种更灵活的方式来组织和重用组件的逻辑。
- Teleport:这是一个新的API,允许我们在组件树中将元素“传送”到其他位置。
- Suspense:这是一个新的API,允许我们在组件树中等待异步数据加载。
- Fragment:这是一个新的内置组件,允许我们在组件中渲染多个根节点。
- v-memo:这是一个新的指令,允许我们在渲染过程中缓存组件的输出。
- 更快的渲染速度:Vue 3中的渲染器已经重写,提供了更快的渲染速度。
2. 安装与配置
要使用Vue 3,我们需要先安装它。可以使用npm或yarn来安装Vue 3:
npm install vue@next
# or
yarn add vue@next
安装完成后,我们可以在JavaScript中使用Vue 3:
import { createApp } from 'vue'const App = {
data() {
return {
message: 'Hello Vue 3!'
}
}
}const app = createApp(App)
app.mount('#app')
或者在HTML中使用Vue 3:
<script src="https://unpkg.com/vue@next"></script><div id="app">{{ message }}
</div><script>const {createApp} = Vueconst App = {data() {return {message: 'Hello Vue 3!'}}}const app = createApp(App)app.mount('#app')
Vue 3 组件基础
1. 组件的概念
在Vue中,组件是构成应用程序的基本单位。组件是独立的、可复用的Vue实例,具有自己的属性、事件、生命周期钩子等。组件可以看作是页面的最小单位,通过组合这些组件,我们可以构建出复杂的页面。
2. 组件的创建与注册
创建Vue组件的方式有多种,可以通过Vue的构造函数,也可以使用defineComponent
函数。
// 使用Vue构造函数
const MyComponent = new Vue({
data() {
return {
message: 'Hello'
}
},
template: '
<div>{{ message }}</div>'
})// 使用defineComponent
const MyComponent = defineComponent({
data() {
return {
message: 'Hello'
}
},
template: '
<div>{{ message }}</div>'
})
注册组件可以通过app.component
方法,也可以在组件内部使用components
选项。
// 全局注册
const app = createApp({})
app.component('my-component', MyComponent)// 局部注册
const MyApp = createApp({})
MyApp.component('my-component', MyComponent)
3. 组件的数据传递
组件之间的数据传递主要通过props
和emit
实现。
Props:用于父组件向子组件传递数据。子组件可以通过defineComponent
的props
选项声明接收的数据。
const MyComponent = defineComponent({
props: {
message: {
type: String,
required: true
}
},
template: '
<div>{{ message }}</div>'
})
Emits:用于子组件向父组件传递数据。子组件可以通过emit
方法触发事件,并传递数据。
const MyComponent = defineComponent({
methods: {
sendMessage() {
this.$emit('message', 'Hello from child')
}
},
template: `
<button @click="sendMessage">Send</button>`
})
4. Props和Emits
- Props是父组件传递给子组件的数据。
- Emits是子组件发送给父组件的事件。
5. Slots:插槽是Vue提供的一种机制,允许组件的内容被分发到组件的模板中。
// 父组件
<template><MyComponent><template v-slot:default>Default Slot Content</template><template v-slot:other>Other Slot Content</template></MyComponent>
</template>// 子组件
<template><div><slot name="default"></slot><slot name="other"></slot></div>
</template>
6. 组件的生命周期
Vue组件的生命周期包括创建、挂载、更新和销毁四个阶段。每个阶段都有对应的生命周期钩子,可以在这个阶段执行特定的操作。
defineComponent({
created() {
// 组件创建完成后调用
},
mounted() {
// 组件挂载到DOM后调用
},
updated() {
// 组件更新后调用
},
destroyed() {
// 组件销毁后调用
}
})
7. 组件的样式
Vue组件的样式可以通过几种方式来定义:
- 在组件的
<style>
标签中定义样式。 - 使用
scoped
属性来限制样式的作用域,使其只应用于当前组件。 - 通过外部CSS文件引入样式。
<style scoped>.my-class {color: red;}
</style>
Vue 3 模板语法
1. 插值表达式 (Interpolation)
在Vue 3中,使用{{ }}
包围的表达式会进行数据绑定。例如:
<p>Message: {{ message }}</p>
当message
的值改变时,页面会自动更新显示。
2. 指令基础
Vue的指令是HTML元素上可以附加的行为。常见的指令有v-bind
,v-model
, 和v-on
。
v-bind
:用于数据绑定,等同于v-bind:attr="expression"
,如v-bind:class="{ active: isActive }"
.v-model
:用于双向数据绑定,主要用于表单输入,如<input v-model="username">
.v-on
:用于监听事件,如<button v-on:click="doSomething">Click me</button>
.
3. v-bind, v-model, v-on
v-bind
:v-bind:key
用于绑定列表元素的唯一标识,v-bind:class
用于动态绑定CSS类。v-model
:用于数据双向绑定,v-model:value
绑定数据,v-model:expression
用于计算属性。v-on
:v-on:click
用于绑定点击事件,v-on:input
用于监听输入事件。
4. v-for
v-for
指令用于渲染数组或对象的每个元素,如:
<ul><li v-for="item in items" :key="item.id">{{ item.name }}</li>
</ul>
5. v-if 与 v-show
v-if
:条件渲染,当表达式为真时元素会被渲染,为假时会被移除。v-show
:条件渲染,无论条件是否满足,元素都会被添加到DOM中,只是通过display
属性的none
或block
来切换可见性。
6. 计算属性与侦听器
- 计算属性:
data
对象中的函数,当依赖的props
或data
属性改变时,计算属性会自动重新计算。 - 侦听器:
watch
对象,监听数据的变化,当数据变化时执行回调。
data() {
return {
count: 0
}
},
computed: {
formattedCount() {
return this.count.toLocaleString();
}
},
watch: {
count(newCount) {
console.log('Count has changed:', newCount);
}
}
7. 条件渲染与列表渲染
- 条件渲染:
v-if
和v-show
用于根据条件展示或隐藏元素。 - 列表渲染:
v-for
遍历数组或对象,可以嵌套使用,方便生成动态列表。
8. 事件处理
- 使用
v-on
绑定事件,如<button v-on:click="doSomething">Click</button>
。 - 可以使用
.sync
修饰符同步原生事件,如<input v-model.sync="value">
。
9. 表单输入绑定
v-model
用于表单输入的双向绑定,如<input type="text" v-model="username">
。v-model.number
或v-model.integer
等修饰符用于类型验证。
高级组件开发
1. 动态组件
动态组件允许你在运行时切换组件。要使用动态组件,你可以使用const component = new VueComponent()
创建一个组件实例,然后使用this.$refs.someRef.component = component
来替换它。
// 定义一个动态组件
const DynamicComponent = {
template: '
<div>Dynamic Component</div>'
}// 在组件中动态替换组件
new Vue({
el: '#app',
components: {
'dynamic-component': DynamicComponent
},
methods: {
changeComponent() {
this.$refs.dynamicComponent.component = DynamicComponent
}
}
})
2. 异步组件
异步组件是为了减少初始加载时间而设计的。你可以通过返回一个Promise
来定义一个异步组件:
const AsyncComponent = () => ({
// 这里可以使用Promise
component: import('./MyComponent'),
loading: LoadingComponent, // 加载中的组件
error: ErrorComponent // 加载错误的组件
})
在组件中使用异步组件:
components: {
'async-component': AsyncComponent
}
3. 递归组件
递归组件是指那些可以调用自身的组件。为了防止无限递归,Vue提供了一个max
属性来限制递归深度:
const RecursiveComponent = {
template: `
<div>{{ message }}<recursive-component :max="max - 1" :message="message"></recursive-component>
</div>
`,
props: {
max: {
type: Number,
default: 5
},
message: String
}
}
4. 函数式组件
函数式组件不接受props
,也不维护任何实例状态。它们只是返回一个渲染函数:
const FunctionalComponent = () => {
// 函数式组件的逻辑
return
<div>Functional Component</div>
}
在组件中使用函数式组件:
components: {
'functional-component': FunctionalComponent
}
5. 自定义指令
自定义指令允许你定义自己的HTML attribute,这些指令可以应用于任何元素,并且可以绑定不同的行为。
Vue.directive('my-directive', (el, binding, vnode) => {
// 指令的逻辑
})
在组件中使用自定义指令:
<div v-my-directive="someValue"></div>
构建一个简单的博客应用
1. 环境准备
- 使用 Vue CLI 创建一个新的 Vue.js 项目。
- 安装所需的依赖,如
vue-router
用于页面路由,vuex
用于状态管理,axios
用于 HTTP 请求等。
2. 项目结构
simple-blog/
|-- public/
|-- src/
| |-- assets/
| |-- components/
| | |-- BlogPost.vue
| | |-- Navigation.vue
| |-- views/
| | |-- Home.vue
| | |-- PostList.vue
| |-- App.vue
| |-- main.js
|-- package.json
3. 实现逻辑
Navigation.vue
:实现顶部导航栏。Home.vue
:实现首页布局。PostList.vue
:实现博客文章列表。BlogPost.vue
:实现单篇博客文章的展示。main.js
:入口文件,创建 Vue 实例,配置路由等。
4. 示例代码
// main.js
import Vue from 'vue'
import App from './App.vue'
import router from './router'new Vue({
router,
render: h => h(App),
}).$mount('#app')
<!-- App.vue -->
<template><div id="app"><Navigation/><router-view/></div>
</template><script>import Navigation from './components/Navigation.vue'export default {components: {Navigation}}
</script>
<!-- Navigation.vue -->
<template><nav><!-- 导航链接 --></nav>
</template>
<!-- PostList.vue -->
<template><div><h1>博客文章列表</h1><ul><li v-for="post in posts" :key="post.id">{{ post.title }}</li></ul></div>
</template><script>export default {data() {return {posts: [] // 从后端 API 获取数据}},created() {// 调用 API 获取文章列表}}
</script>
<!-- BlogPost.vue -->
<template><div><h1>{{ post.title }}</h1><p>{{ post.content }}</p></div>
</template><script>export default {props: {post: Object}}
</script>
5. 运行项目
使用npm run serve
命令启动项目,然后访问http://localhost:8080
查看效果。
这是一个基本的博客应用,可以根据实际需求继续扩展和优化。
附录
Vue 3 资源推荐
- 官方文档:Vue 3 官方文档提供了详尽的指南和 API 参考,是学习 Vue 3 的最佳起点。
- Vue Mastery:Vue Mastery提供了许多免费的 Vue 3 教程视频,适合初学者和进阶开发者。
- Vue School:Vue School提供了付费的 Vue 3 课程,涵盖从基础到高级的所有内容。
- GitHub 仓库:Vue 3 的 GitHub 仓库是查看源代码和贡献代码的好地方。
- 社区论坛:Vue.js 论坛是提问和分享经验的好地方。
常见问题解答
-
如何升级到 Vue 3?
- 首先,确保你的项目依赖支持 Vue 3。然后,更新
package.json
中的 Vue 依赖版本到 3.x。最后,检查并更新你的代码以适应 Vue 3
的新特性和变化。
- 首先,确保你的项目依赖支持 Vue 3。然后,更新
-
Vue 3 和 Vue 2 有什么主要区别?
- Vue 3 引入了 Composition API,提供了更好的逻辑复用和代码组织方式。此外,Vue 3 在性能上有所提升,包括更快的虚拟 DOM
和更小的包体积。
- Vue 3 引入了 Composition API,提供了更好的逻辑复用和代码组织方式。此外,Vue 3 在性能上有所提升,包括更快的虚拟 DOM
-
如何在 Vue 3 中使用 Vuex?
- Vuex 4 是专为 Vue 3 设计的版本。你可以通过安装
vuex@next
来使用 Vuex 4,并在你的 Vue 3 项目中配置和使用它。
- Vuex 4 是专为 Vue 3 设计的版本。你可以通过安装
-
Vue 3 支持 TypeScript 吗?
- 是的,Vue 3 对 TypeScript 提供了更好的支持。你可以使用 TypeScript 来编写 Vue 3 组件,并利用 Vue 3 的类型声明来提高开发效率。
-
如何处理 Vue 3 中的响应式数据?
- Vue 3 使用
ref
和reactive
函数来创建响应式数据。ref
用于创建单个响应式数据,而reactive
用于创建响应式对象。
- Vue 3 使用
-
Vue 3 中的 Teleport 是什么?
- Teleport 是 Vue 3 中的一个新特性,允许你将组件的内容渲染到 DOM 树的另一个位置,这在创建模态框或弹出菜单时非常有用。
-
Vue 3 中的 Fragment 是什么?
- 在 Vue 3 中,组件可以返回多个根节点,这被称为 Fragments。这允许你编写更简洁的模板,而不需要额外的包装元素。
-
如何调试 Vue 3 应用程序?
- 你可以使用浏览器的开发者工具来调试 Vue 3 应用程序。Vue 3 支持 Vue 2 的开发者工具扩展,你可以通过它来检查组件状态和追踪事件。
相关文章:

Vue 3 组件基础与模板语法详解
title: Vue 3 组件基础与模板语法详解 date: 2024/5/24 16:31:13 updated: 2024/5/24 16:31:13 categories: 前端开发 tags: Vue3特性CompositionAPITeleportSuspenseVue3安装组件基础模板语法 Vue 3 简介 1. Vue 3 的新特性 Vue 3引入了许多新的特性,以提高框…...

ACM实训冲刺第十八天
统计元音 代码 需要注意的是getchar()和gets(s) #include<stdio.h> #include<string.h> int main(){//测试实例个数int n;scanf("%d",&n) ;char s[100];getchar();while(n--){gets(s);int cnta0,cnte0,cnti0,cnto0,cntu0;for(int j0;j<strlen(…...

22AP70/SS927
Hi3519AV200又叫SS927V100和SD3402V100,或者叫22AP70,是一颗面向市场推出的专业超高清智能网络录像机SoC,专门用来替换之前的Hi3519AV100,2023年推出的业界AI-ISP超高性价比芯片!该芯片最高支持四路sensor输入…...

C++实现的代码行数统计器
代码在GitHubMaolinYe/CodeCounter: C20实现的代码统计器,代码量小于100行,可以统计目录下所有代码文件的行数 (github.com) 前段时间到处面试找实习,有技术负责人的负责人问我C写过多少行,5万还是10万,用来评估熟练度…...

C# 结合 JS 暴改腾讯 IM SDK Demo
目录 关于腾讯 IM SDK Demo 范例运行环境 设计思路 服务端生成地址 IM 服务端接收 IM 客户端程序 小结 关于腾讯 IM SDK Demo 腾讯云即时通信 IM SDK 提供了单聊、群聊、关系链、消息漫游、群组管理、资料管理、直播弹幕等功能,并提供完备的 App 接入及管…...

【Web】CISCN 2024初赛 题解(全)
目录 Simple_php easycms easycms_revenge ezjava mossfern sanic Simple_php 用php -r进行php代码执行 因为ban了引号,考虑hex2bin,将数字转为字符串 php -r eval(hex2bin(16进制)); 注意下面这段报错,因为加不了引号,开…...

【C++进阶】AVL树
0.前言 前面我们已经学习过二叉搜索树了,但如果我们是用二叉搜索树来封装map和set等关联式容器是有缺陷的,很可能会退化为单分支的情况,那样效率就极低了,那么有没有方法来弥补二叉搜索树的缺陷呢? 那么AVL树就出现了&…...

云部署最简单python web
最近在玩云主机,考虑将简单的web应用装上去,通过广域网访问一下,代码很简单,所以新手几乎不会碰到什么问题。 from flask import Flaskapp Flask(__name__)app.route(/) def hello_world():return Hello, World!app.route(/gree…...

【Pytorch】【MacOS】14.m1芯片使用mps进行深度模型训练
读者要先自行安装python以及anaconda,并且配置pytorch环境 第一步 测试环境 import torch # 判断macOS的版本是否支持 print(torch.backends.mps.is_available()) # 判断mps是否可用 print(torch.backends.mps.is_built())如果第一个语句为False,说明当前…...

go学习笔记-从圣经中抄录的接口值的思考
接口值 接口值,由两个部分组成,一个具体的类型和那个类型的值 下面4个语句中,变量w得到了3个不同的值。( 开始和最后的值是相同的) var w io.Writer w os.Stdout w new(bytes.Buffer) w nil var w io.Writer var…...

ICML 2024 时空数据(Spatial-Temporal)论文总结
2024ICML(International Conference on Machine Learning,国际机器学习会议)在2024年7月21日-27日在奥地利维也纳举行 (好像ICLR24现在正在维也纳开)。 本文总结了ICML 24有关时空数据(Spatial-temporal) 的相关论文…...

多线程(C++11)
多线程(C) 文章目录 多线程(C)前言一、std::thread类1.线程的创建1.1构造函数1.2代码演示 2.公共成员函数2.1 get_id()2.2 join()2.3 detach()2.4 joinable()2.5 operator 3.静态函数4.类的成员函数作为子线程的任务函数 二、call…...

HLS入门
目录 一、 内容介绍二、 理解HLS2.1 HLS是什么?与VHDL/Verilog编程技术有什么关系?2.2 HLS有哪些关键技术问题?目前存在什么技术局限性? 三、 HLS在Quartus上的实现3.1 配置环境3.2 测试 四、 参考链接 一、 内容介绍 理解HLSHLS在Quartus上…...

电信光猫的USB存储对外网开放访问
前提条件当然是要有公网IP地址了,没有的话去找电信索要,然后可以使用动态域名正常访问。 我的电信光猫发现共享访问速度还可以,会有31M/s左右的写入速度 但是有一个不方便的是,无法从外网提供访问,SMB协议所用的445端…...

世界上首位AI程序员诞生,AI将成为人类的对手吗?
3月13日,世界上第一位AI程序员Devin诞生,不仅能自主学习新技术,自己改Bug,甚至还能训练和微调自己的AI模型,表现已然远超GPT-4等“顶流选手”。 AI的学习速度如此之快,人类的教育能否跟上“机器学习”的速…...

什么是创造力?如何判断自己的创造力?
创造力,主要表现为创新思想、发现和创造新事物的能力,是知识,智力和能力的综合能力,尤其是在职业发展方面,创造力具有重要的意义,企业的核心竞争力就来源于创造力,这就需要具有创造力的员工来推…...

Elasticsearch集群搭建学习
Elasticsearch集群聚合、集群搭建 RestClient查询所有高亮算分控制 数据聚合DSL实现Bucket聚合DSL实现Metrics聚合RestAPI实现聚合 拼音分词器如何使用拼音分词器?如何自定义分词器?拼音分词器注意事项? 自动补全数据同步集群搭建ES集群结构创…...

数据库(vb.net+OleDB+Access)简易学生信息管理系统
在我们日常生活当中,数据库一词往往离不开我们的编程界,在学校、仓库等方面起着存储数据及数据关系作用的文件。相较于Excel,Access可以存储无限多的记录,内容也十分丰富,例如文本、数字、日期、T&F等。而且不需要…...

Android 自定义图片进度条
用系统的Progressbar,设置图片drawable作为进度条会出现图片长度不好控制,容易被截断,或者变形的问题。而我有个需求,使用图片背景,和图片进度,而且在进度条头部有个闪光点效果。 如下图: 找了…...

对话:用言语构建深刻的思想碰撞
对话:用言语构建深刻的思想碰撞 在写书中,对话是一种有力的工具,能与读者进行有效的沟通和交流,引发深思和反思。它不仅是信息传递的方式,更是加深情感、探讨主题和吸引读者参与的桥梁。你应从读者的角度思考…...

Linux完整版命令大全(九)
4. linux压缩备份命令 ar 功能说明:建立或修改备存文件,或是从备存文件中抽取文件。语 法:ar[-dmpqrtx][cfosSuvV][a<成员文件>][b<成员文件>][i<成员文件>][备存文件][成员文件]补充说明:ar可让您集合许多…...

solidworks画螺栓学习笔记
螺栓 单位mm 六边形 直径16mm 水平约束 拉伸 选择厚度6mm 拉伸切除 画相切圆 切除厚度6mm,反向切除 ,拔模角度45 螺栓 直径9mm,长度30mm 倒角 直径1mm,角度45 异形孔向导 螺纹线 偏移打勾,距离为2mm&#…...

【Spark】加大hive表在HDFS存的每个文件的大小
配置参数: spark.hadoop.hive.exec.orc.default.stripe.size78643200 spark.hadoop.orc.stripe.size78643200 spark.hadoopRDD.targetBytesInPartition78643200 spark.hadoop.hive.exec.dynamic.partition.modenonstrict spark.sql.sources.partitionOverwriteMode…...

2024 年 5 个 GO REST API 框架
什么是API? API是一个软件解决方案,作为中介,使两个应用程序能够相互交互。以下一些特征让API变得更加有用和有价值: 遵守REST和HTTP等易于访问、广泛理解和开发人员友好的标准。API不仅仅是几行代码;这些是为移动开…...

socket地址理解
socket介绍 套接字的基本概念 1. 套接字的定义: 套接字(socket)是计算机网络中用于通信的端点,它抽象了不同主机上应用进程之间双向通信的机制。 2. 套接字的作用: 套接字连接应用进程与网络协议栈,使…...

Gopeed的高级用法
Gopeed是一个开源全平台下载器,具体简介请参考: “狗屁下载器”?Gopeed - 开源全平台下载器 (免费轻量 / 比 Aria2 好用 / 远程下载) - 异次元软件世界 (iplaysoft.com) 这里主要介绍下自己摸索出来的 Gopeed 的高级做法。 有的网站添加的…...

OpenHarmony系统使用gdb调试init
前言 OpenAtom OpenHarmony(简称“OpenHarmony”)适配新的开发板时,启动流程init大概率会出现问题,其为内核直接拉起的第一个用户态进程,问题定位手段只能依赖代码走读和增加调试打印,初始化过程中系统崩溃…...

【SpringCloud】Spring Cloud基本介绍
目录 回顾架构分类单体架构分布式架构微服务架构什么是微服务优点缺点微服务的架构特征:微服务架构面临的挑战技术挑战微服架构的设计原则微服务概念提供者(Provider)消费者(Consumer)RPC和Restful集群分布式 总结 服务拆分和远程调用服务拆分原则服务拆分示例 思考…...

全域运营是本地生活服务的新模式吗?
最近,本地生活赛道又出现了一个新的说法,即全域运营是本地生活的下半场。事实上,这一论断并非空穴来风,而是有真凭实据。 作为多家互联网大厂重点布局的业务板块,本地生活的火爆程度早已有目共睹。根据多家互联网大厂…...

机器视觉-硬件
机器视觉-硬件 镜头焦距凸透镜焦点不止一个相机镜头由多个镜片组成对焦和变焦 镜头光圈光圈的位置光圈系数F 镜头的景深景深在光路中的几何意义 远心镜头远心镜头的种类远心镜头特性应用场景 镜头的分辨率镜头反差镜头的MTF曲线镜头的靶面尺寸镜头的几何相差相机镜头接口螺纹接…...