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
英文地址,請注明出處:http://en.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;而是將傳統的電路交換模式徹底轉向包交換…