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} = Vue
const 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 组件基础与模板语法详解的更多相关文章
- discuz门户首页-header文件模板语法详解和注释
header文件引用了跟多通用模板,所以整个文章会很长,现在比较忙,注释工作会不定期进行 首先开下门户首页的文件 portal里面的index.htm <!--{template common/ ...
- Vue.js 数据绑定语法详解
Vue.js 数据绑定语法详解 一.总结 一句话总结:Vue.js 的模板是基于 DOM 实现的.这意味着所有的 Vue.js 模板都是可解析的有效的 HTML,且通过一些特殊的特性做了增强.Vue ...
- [转帖]helm模板文件chart编写语法详解
helm模板文件chart编写语法详解 https://blog.51cto.com/qujunorz/2421328 需要学习一下. charts编写介绍 开始 快速创建一个chart模板,helm ...
- Velocity魔法堂系列二:VTL语法详解
一.前言 Velocity作为历史悠久的模板引擎不单单可以替代JSP作为Java Web的服务端网页模板引擎,而且可以作为普通文本的模板引擎来增强服务端程序文本处理能力.而且Velocity被移植到不 ...
- es6语法详解
什么是ECMAScript? ECMAScript是浏览器脚本语言的规范,而我们熟知的js语言,如JavaScript则是规范的具体实现.es6就好比Java的jdk. 一.es6语法详解:let声明 ...
- Hive笔记--sql语法详解及JavaAPI
Hive SQL 语法详解:http://blog.csdn.net/hguisu/article/details/7256833Hive SQL 学习笔记(常用):http://blog.sina. ...
- mysql基础篇 - SELECT 语句详解
基础篇 - SELECT 语句详解 SELECT语句详解 一.实验简介 SQL 中最常用的 SELECT 语句,用来在表中选取数据,本节实验中将通过一系列的动手操作详细学习 SELEC ...
- 转载 JS组件Bootstrap Select2使用方法详解
JS组件Bootstrap Select2使用方法详解 作者:懒得安分 字体:[增加 减小] 类型:转载 时间:2016-01-26我要评论 这篇文章主要为大家介绍了JS组件Bootstrap Sel ...
- Java基础-面向接口编程-JDBC详解
Java基础-面向接口编程-JDBC详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.JDBC概念和数据库驱动程序 JDBC(Java Data Base Connectiv ...
- Vue实例初始化的选项配置对象详解
Vue实例初始化的选项配置对象详解 1. Vue实例的的data对象 介绍 Vue的实例的数据对象data 我们已经用了很多了,数据绑定离不开data里面的数据.也是Vue的核心属性. 它是Vue绑定 ...
随机推荐
- Java轻松实现,每天给对象发情话!
一.引言 最近看到一篇用js代码实现表白的文章,深有感触.然后发现自己也可以用java代码实现,然后就开始写代码了,发现还挺有意思的,话不多说开搞实现思路: 使用HttpClient远程获取彩虹屁生成 ...
- MySQL学习路线一条龙
引言 在当前的IT行业,无论是校园招聘还是社会招聘,MySQL的重要性不言而喻. 面试过程中,MySQL相关的问题经常出现,这不仅因为它是最流行的关系型数据库之一,而且在日常的软件开发中,MySQL的 ...
- Nacos无法连接wsl2上部署的MySQL
情况描述 在部署Nacos时,需要连接MySQL数据库管理数据,但是如果连接的是wsl2上部署的MySQL,使用127.0.0.1或者localhost,通常会出现如下错误: org.springfr ...
- 【中秋国庆不断更】XML在HarmonyOS中的生成,解析与转换(下)
一.XML解析 对于以XML作为载体传递的数据,实际使用中需要对相关的节点进行解析,一般包括解析XML标签和标签值.解析XML属性和属性值.解析XML事件类型和元素深度三类场景. XML模块提供Xml ...
- 日志分析qsnctfwp
使用工具:http Logs Viewer 使用 http Logs Viewer 载入 access.log 按照 Status 排序 其中大量 Status 为404的日志不难推断出,这是在进行目 ...
- k8s 深入篇———— docker 镜像是什么[二]
前言 简单介绍一下docker的镜像. 正文 前面讲到了容器的工作原理了(namespace 限制了时间, cgroup限制了资源),知道docker 历史的也知道,docker 之所以能够称为容器大 ...
- Node 中的 Stream ?应用场景?
一.是什么 流(Stream),是一种数据传输手段,是端到端信息交换的一种方式,是有顺序的,是逐块读取数据.处理内容,用于顺序读取输入或写入输出 在很多时候,流(Stream)是字节流(Byte St ...
- 嘉楠k210 多线程 点亮流水灯
from Maix import GPIO from fpioa_manager import fm import _thread import time fm.register(24, fm.fpi ...
- 谢老师2024春 - Day2:期望DP
Day2:期望DP A - CF148D Bag of mice 设 \(dp_{i,j}\) 表示还剩下 \(i\) 只白鼠,\(j\) 只黑鼠 A 的胜率. 大家都没有拿到白鼠,那么 B 赢, ...
- EasyCV DataHub 提供多领域视觉数据集下载,助力模型生产
简介: 在人工智能广泛应用的今天,深度学习技术已经在各行各业起到了重要的作用.在计算机视觉领域,深度学习技术在大多数场景已经替代了传统视觉方法.如果说深度学习是一项重要的生产工具,那么数据就是不可或缺 ...