Vue 3 入门教程 2- Vue 组件基础与模板语法

一、Vue 组件基础

在 Vue 中,组件是构建用户界面的基本单位,它可以将页面拆分成多个独立、可复用的部分。一个 Vue 组件通常以 .vue 文件名结尾,包含三个核心部分:模板(Template)、脚本(Script)和样式(Style)。

1.1 单文件组件(.vue 文件)结构

单文件组件(SFC)是 Vue 推荐的组件组织方式,其结构清晰,便于维护。

<template><!-- 模板部分:定义组件的 HTML 结构 --><div class="hello"><h1>{{ msg }}</h1></div></template><script setup><!-- 脚本部分:处理组件的逻辑 -->// 导入需要的模块或组件import { ref } from 'vue'// 定义组件的数据const msg = ref('Hello Vue 3!')</script><style scoped>
<!-- 样式部分:定义组件的样式 -->.hello {color: blue;text-align: center;}</style>

  • 模板(Template):必须包含在 <template> 标签内,用于定义组件的渲染结构。一个组件的模板只能有一个根元素(Vue 3 支持多根元素,但通常建议使用一个根元素包裹)。
  • 脚本(Script):使用 <script setup> 语法(Vue 3 推荐),用于编写组件的逻辑,包括数据定义、方法声明、生命周期钩子等。setup 是 Vue 3 组合式 API 的入口点。
  • 样式(Style):包含在 <style> 标签内,用于定义组件的样式。添加 scoped 属性后,样式仅作用于当前组件,避免样式污染。

1.2 组件的注册与使用

组件分为全局注册和局部注册两种方式,全局注册的组件可在整个应用中使用,局部注册的组件仅能在注册它的父组件中使用。

1.2.1 全局注册

在 main.js 中通过 app.component() 方法全局注册组件:

// main.js
import { createApp } from 'vue'import App from './App.vue'import HelloWorld from './components/HelloWorld.vue'const app = createApp(App)// 全局注册 HelloWorld 组件,第一个参数是组件名,第二个参数是组件对象app.component('HelloWorld', HelloWorld)app.mount('#app')

注册后,可在任意组件的模板中直接使用:

<template><div><HelloWorld /></div>
</template>
1.2.2 局部注册

在需要使用组件的父组件中,通过 import 导入组件后,在 components 选项中注册:

<template><div><LocalComponent /></div></template><script setup>import LocalComponent from './components/LocalComponent.vue'// 在 setup 语法中,导入的组件会自动注册,无需额外配置</script>

1.3 组件通信基础(父传子)

父组件通过 props 向子组件传递数据,子组件通过定义 props 接收数据。

父组件示例
<template><div><ChildComponent :message="parentMsg" :count="10" /></div></template><script setup>import { ref } from 'vue'import ChildComponent from './components/ChildComponent.vue'const parentMsg = ref('来自父组件的消息')</script>
子组件示例
<template>
<div>
<p>{{ message }}</p>
<p>接收的数字:{{ count }}</p>
</div>
</template>
<script setup>
import { defineProps } from 'vue'
// 定义 props,指定接收的属性名和类型
const props = defineProps({
message: String,
count: Number
})
// 使用 props 中的数据(直接通过 props.属性名访问)console.log(props.message)

</script>

在子组件中,defineProps 用于声明接收的 props,可以指定属性的类型、默认值、验证规则等。父组件传递数据时,通过 v-bind(简写为 :)将数据绑定到子组件的属性上。

二、模板语法

Vue 的模板语法是一种基于 HTML 的模板系统,它允许在 HTML 中嵌入 Vue 特有的语法,实现数据绑定、条件渲染、列表渲染等功能。

2.1 文本插值

使用双大括号 {{ }} 可以将响应式数据插入到模板中,这称为文本插值。

<template><div><p>基本文本:{{ username }}</p><p>表达式计算:{{ 1 + 2 * 3 }}</p><p>函数调用:{{ formatMessage('Hello') }}</p></div></template><script setup>import { ref } from 'vue'const username = ref('Vue 用户')const formatMessage = (str) => {return str + ',欢迎使用 Vue 3'}</script>

双大括号内可以是变量、表达式或函数调用,Vue 会自动计算并将结果渲染到页面上。当数据发生变化时,插值内容会自动更新。

2.2 指令

指令是带有 v- 前缀的特殊属性,用于在模板中实现复杂的逻辑操作。

2.2.1 v-bind:绑定属性

v-bind 用于动态绑定 HTML 属性,可简写为 :。

<template>
<div>
<img v-bind:src="imageUrl" alt="图片">
<a :href="linkUrl" :class="{ active: isActive }">链接</a>
</div>
</template>
<script setup>
import { ref } from 'vue'
const imageUrl = ref('https://vuejs.org/images/logo.png')
const linkUrl = ref('https://vuejs.org')
const isActive = ref(true)
</script>
<style>
.active {
color: red;
text-decoration: underline;
}
</style>

上述示例中,src、href、class 属性的值通过 v-bind 绑定到响应式数据上,当数据变化时,属性值会自动更新。class 还支持对象语法,根据 isActive 的值动态添加或移除 active 类。

2.2.2 v-on:事件绑定

v-on 用于绑定事件监听器,可简写为 @。

<template>
<div>
<button v-on:click="handleClick">点击按钮</button>
<button @dblclick="handleDoubleClick">双击按钮</button>
<input @input="handleInput" placeholder="输入内容">
</div>
</template>
<script setup>
import { ref } from 'vue'
const handleClick = () => {
console.log('按钮被点击了')
}
const handleDoubleClick = () => {
console.log('按钮被双击了')
}
const handleInput = (e) => {
console.log('输入的内容:', e.target.value)
}
</script>

v-on 可以绑定各种 DOM 事件,事件处理函数可以接收事件对象 e,通过 e.target 等属性获取事件相关信息。

2.2.3 v-model:双向数据绑定

v-model 用于在表单元素(如输入框、复选框等)和响应式数据之间建立双向绑定,即数据变化时表单元素的值会更新,表单元素的值变化时数据也会同步更新。

<template>
<div>
<input v-model="username" placeholder="输入用户名">
<p>您输入的用户名:{{ username }}</p>
<textarea v-model="content" placeholder="输入内容"></textarea>
<p>文本域内容:{{ content }}</p>
<label>
<input type="checkbox" v-model="isAgree"> 同意协议
</label>
<p>是否同意:{{ isAgree }}</p>
</div>
</template>
<script setup>
import { ref } from 'vue'
const username = ref('')
const content = ref('')
const isAgree = ref(false)
</script>

v-model 会根据表单元素的类型自动选择合适的绑定方式,例如文本输入框绑定 value 属性和 input 事件,复选框绑定 checked 属性和 change 事件。

2.2.4 条件渲染(v-if /v-else/v-else-if)

v-if、v-else、v-else-if 用于根据条件动态渲染元素。

<template><div><p v-if="score >= 90">优秀</p><p v-else-if="score >= 60">及格</p><p v-else>不及格</p><button @click="score += 10">加分</button><button @click="score -= 10" :disabled="score < 10">减分</button><p>当前分数:{{ score }}</p></div></template><script setup>import { ref } from 'vue'const score = ref(70)</script>

v-if 会根据条件决定是否渲染元素,如果条件为 false,元素会被从 DOM 中移除;而 v-show 则是通过 display: none 控制元素的显示与隐藏,元素始终存在于 DOM 中。通常,频繁切换显示状态时使用 v-show 性能更好,条件很少改变时使用 v-if 更合适。

2.2.5 列表渲染(v-for)

v-for 用于基于数组或对象渲染列表,语法为 v-for="(item, index) in items",其中 item 是数组元素,index 是元素的索引(可选)。

<template><div><h3>数组渲染</h3><ul><li v-for="(fruit, index) in fruits" :key="index">{{ index + 1 }}. {{ fruit }}</li></ul><h3>对象渲染</h3><ul><li v-for="(value, key) in user" :key="key">{{ key }}: {{ value }}</li></ul></div></template><script setup>import { ref, reactive } from 'vue'const fruits = ref(['苹果', '香蕉', '橙子'])const user = reactive({name: '张三',age: 25,gender: '男'})</script>

使用 v-for 时,必须为每个列表项指定 key 属性,key 的值应该是唯一的(通常使用数据的唯一标识,如 ID),以便 Vue 能够高效地跟踪列表项的变化,优化渲染性能。

2.3 事件修饰符

事件修饰符用于处理事件的默认行为或事件冒泡等问题,通过 .修饰符 的形式添加到 v-on 指令后。

常用的事件修饰符:

  • .stop:阻止事件冒泡
  • .prevent:阻止事件的默认行为
  • .once:事件只触发一次
  • .self:只有事件目标是当前元素时才触发事件
<template><div @click="parentClick"><button @click.stop="childClick">点击(阻止冒泡)</button><a href="https://vuejs.org" @click.prevent="handleLinkClick">Vue 官网(阻止跳转)</a><button @click.once="onceClick">只点击一次</button></div></template><script setup>const parentClick = () => {console.log('父元素点击事件')}const childClick = () => {console.log('子元素点击事件')}const handleLinkClick = () => {console.log('链接被点击')}const onceClick = () => {console.log('只触发一次')}</script>
  • 在上述示例中:

  • .stop 阻止了子元素的点击事件冒泡到父元素,因此点击按钮时只会触发 childClick,不会触发 parentClick。
  • .prevent 阻止了链接的默认跳转行为,点击链接时只会执行 handleLinkClick。
  • .once 使按钮的点击事件只触发一次。

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

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

相关文章

Linux 进程管理与计划任务详解

Linux 进程管理与计划任务详解 一、程序与进程的基本概念 程序&#xff1a;保存在外部存储介质中的可执行机器代码和数据的静态集合&#xff0c;是静态的文件实体进程&#xff1a;在 CPU 及内存中处于动态执行状态的计算机程序&#xff0c;是程序的动态执行实例关联关系&#x…

分层解耦(Controller,Service,Dao)

1. 三层架构核心职责层级职责说明关键技术 / 注解Controller&#xff08;控制器&#xff09;1. 接收前端请求&#xff08;HTTP&#xff09; 2. 封装参数、校验 3. 调用 Service 处理业务 4. 返回视图 / 数据给前端Controller、GetMapping等Service&#xff08;业务层&#xff0…

镁金属接骨螺钉注册检测:骨科植入安全的科学基石

在骨科治疗领域&#xff0c;镁金属接骨螺钉凭借其可降解性与生物相容性&#xff0c;成为传统金属植入物的革新替代方案。然而&#xff0c;作为Ⅲ类高风险无源植入器械&#xff08;分类编码13-01-01&#xff09;&#xff0c;其注册检测需覆盖生物相容性、化学表征、降解性能、力…

模具开发和管理系统(c#)

以前编写的一个管理模具开发和进度的程序&#xff0c;可以跟踪模具开发进度&#xff0c;可以查询模具具体情况&#xff0c;也可以用水晶报表查询。OS&#xff1a;microsoft windows IDE&#xff1a;microsoft visual studio programming language&#xff1a;C# DataBase&#…

【WRF-Chem 实例1】namelist.input 详解- 模拟CO2

目录 &time_control(时间控制) &physics(物理过程参数化方案) &fdda(四维数据同化) 工作机制简述 &dynamics(WRF 动力核心的数值方法和选项) &bdy_control(边界控制设置) &chem(WRF-Chem 主要化学设置) &namelist_quilt(并行 I/O 控制…

数据中心-时序数据库InfluxDB

目录 一、InfluxDB介绍 1.1 什么是InfluxDB&#xff1f; 1.2 应用场景 1.3 特点 1.4 版本差异 二、数据模型和存储架构 2.1 相关概念 2.2 存储架构 三、InfluxDB基础操作 3.1 数据库操作 3.2 数据表操作 显示所有表 新建表 删除表 3.3 数据保存策略 查看保存策…

webpack-高级配置

多入口文件 如何输出多个html文件 输入位置 需要写两个entryoutput位置也要改一下 加一个name避免重名 在生成html时 要根据每一个入口都写一个插件 并且chunks要写好 当前html引入哪些文件如何抽离压缩css文件 安装插件在rules里面添加插件plugins中添加css抽离代码压缩css抽离…

WinForm组件之Label 控件

Label 控件Label 控件是 WinForm 中最基础、最常用的控件之一&#xff0c;主要用于在界面上显示文本信息&#xff0c;通常作为说明、提示或标题&#xff0c;不直接接受用户输入。它是构建用户界面的基础组件&#xff0c;在引导用户操作、展示状态信息等方面发挥重要作用。Label…

鸿蒙中相册权限弹窗

model.json5配置权限{"name": ohos.permission.READ_MEDIA,"reason":"$string:permission_reason_IMG","usedScene": {}}ui使用const url albumClass.onRequestCameraPermission()类import { abilityAccessCtrl, common, PermissionR…

智能车辆热管理测试方案——提升效能与保障安全

车辆热管理在能源危机出现、汽车排放法规日益严格以及人们对汽车舒适性要求更高的背景下应运而生。将各个系统或部件如冷却系统、润滑系统和空调系统等集成一个有效的热管理系统&#xff1b;控制和优化车辆的热量传递过程&#xff0c;保证各关键部件和系统良好运行&#xff1b;…

如何提升 TCP 传输数据的性能?详解

TCP 会保证每一个报文都能够抵达对方&#xff0c;它的机制是这样&#xff1a;报文发出去后&#xff0c;必须接收到对方返回的确认报文 ACK&#xff0c;如果迟迟未收到&#xff0c;就会超时重发该报文&#xff0c;直到收到对方的 ACK 为止 所以&#xff0c;TCP 报文发出去后&…

WiFi连接简单流程

WiFi连接流程与Debug方法一、WiFi连接全流程与详细日志解读 WiFi连接是一个多阶段、跨层次的复杂过程&#xff0c;涉及物理层、链路层、网络层和应用层的多种协议协作。整个流程包括AP初始化、终端扫描、认证、关联、四次握手、DHCP获取IP、网络可用与后续服务。1. AP初始化与参…

Python——Pandas库,超详细教程

前言1、Python的Pandas是一个基于Python构建的开源数据分析库&#xff0c;它提供了强大的数据结构和运算功能。2、Series&#xff1a;一维数组&#xff0c;类似于Numpy中的一维array&#xff0c;但具有索引标签&#xff0c;可以保存不同类型的数据&#xff0c;如字符串、布尔值…

go语言的gRPC教程-protobuf基础

一、前言 RPC&#xff0c;全称Remote Procedure Call&#xff0c;中文译为远程过程调用。通俗地讲&#xff0c;使用RPC进行通信&#xff0c;调用远程函数就像调用本地函数一样&#xff0c;RPC底层会做好数据的序列化与传输&#xff0c;从而能使我们更轻松地创建分布式应用和服…

Linux基本指令,对路径的认识

引言简单介绍一些Linux的基本指令&#xff0c;快速上手Linux操作系统。一、ls指令语法&#xff1a;ls [选项] [目录或文件]功能&#xff1a;&#xff1a;对于目录&#xff0c;该命令列出该目录下的所有子目录与文件。对于文件件&#xff0c;将列出文件名以及其他信息常用选项&a…

25. html 使用的字符集是什么,有什么特点

总结 utf-8&#xff0c;支持所有语言一、HTML 默认使用的字符集✅ HTML 页面推荐使用 UTF-8 字符集<meta charset"UTF-8" />这是 HTML5 中推荐的标准字符编码&#xff0c;用于定义网页中字符的编码方式。二、什么是字符集&#xff08;Character Encoding&#…

MySQL 读写分离(含示例代码)

背景 面对日益增加的系统访问量,数据库的吞吐量面临着巨大瓶颈。对于同一时刻有大量并发读操作和较少写操作类型的应用系统来说,将数据库拆分为主库和从库,主库负责处理事务性的增删改操作,从库负责处理查询操作,能够有效的避免由数据更新导致的行锁,使得整个系统的查询性…

C#中Visual Studio平台按照OfficeOpenXml步骤

找到包的地址&#xff1a; NuGet Gallery | DocumentFormat.OpenXml.Framework 3.3.0 https://nuget.info/packages 报错&#xff1a; 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 无法解析依赖项“EPPlus”。使用的源: Officeopenxml, Mic…

【Linux】重生之从零开始学习运维之备份恢复

备份恢复准备工作16主机-ubuntu系统准备日志目录mkdir -p /data/mysql/logs/ chown mysql:mysql -R /data/mysql定制日志配置vim /etc/mysql/mariadb.conf.d/50-server.cnf log_bin/data/mysql/logs/binlog systemctl restart mariadb删除db1数据库drop database db1;13主机-ub…

VoIP技术全面深度学习指南:从原理到实践的认知进化

一、VoIP技术的本质认知与历史演进 1.1 技术本质的深层理解 VoIP&#xff08;Voice over Internet Protocol&#xff0c;IP语音传输&#xff09;从根本上代表了通信技术的范式转换。这不仅仅是将模拟语音信号数字化那么简单&#xff0c;而是将传统的电路交换模式彻底转向包交换…