02 VUE學習:模板語法

模板語法

Vue 使用一種基于 HTML 的模板語法,使我們能夠聲明式地將其組件實例的數據綁定到呈現的 DOM 上。所有的 Vue 模板都是語法層面合法的 HTML,可以被符合規范的瀏覽器和 HTML 解析器解析。

在底層機制中,Vue 會將模板編譯成高度優化的 JavaScript 代碼。結合響應式系統,當應用狀態變更時,Vue 能夠智能地推導出需要重新渲染的組件的最少數量,并應用最少的 DOM 操作。

如果你對虛擬 DOM 的概念比較熟悉,并且偏好直接使用 JavaScript,你也可以結合可選的 JSX 支持直接手寫渲染函數而不采用模板。但請注意,這將不會享受到和模板同等級別的編譯時優化。

文本插值

最基本的數據綁定形式是文本插值,它使用的是“Mustache”語法 (即雙大括號):

<span>Message: {{ msg }}</span>

雙大括號標簽會被替換為相應組件實例中msg 屬性的值。同時每次 msg 屬性更改時它也會同步更新。

原始 HTML

雙大括號會將數據解釋為純文本,而不是 HTML。若想插入 HTML,你需要使用 v-html 指令:

<p>Using text interpolation: {{ rawHtml }}</p>
<p>Using v-html directive: <span v-html="rawHtml"></span></p>

這里看到的 v-html attribute 被稱為一個指令。指令由 v- 作為前綴,表明它們是一些由 Vue 提供的特殊 attribute,你可能已經猜到了,它們將為渲染的 DOM 應用特殊的響應式行為。這里我們做的事情簡單來說就是:在當前組件實例上,將此元素的 innerHTML 與 rawHtml 屬性保持同步。

span 的內容將會被替換為 rawHtml 屬性的值,插值為純 HTML——數據綁定將會被忽略。注意,你不能使用 v-html 來拼接組合模板,因為 Vue 不是一個基于字符串的模板引擎。在使用 Vue 時,應當使用組件作為 UI 重用和組合的基本單元。

請添加圖片描述

Attribute 綁定

雙大括號不能在 HTML attributes 中使用。想要響應式地綁定一個 attribute,應該使用 v-bind 指令:

<div v-bind:id="dynamicId"></div>

v-bind 指令指示 Vue 將元素的 id attribute 與組件的 dynamicId 屬性保持一致。如果綁定的值是 null 或者 undefined,那么該 attribute 將會從渲染的元素上移除。

簡寫

因為 v-bind 非常常用,我們提供了特定的簡寫語法:

<div :id="dynamicId"></div>

開頭為 : 的 attribute 可能和一般的 HTML attribute 看起來不太一樣,但它的確是合法的 attribute 名稱字符,并且所有支持 Vue 的瀏覽器都能正確解析它。此外,他們不會出現在最終渲染的 DOM 中。

同名簡寫

如果 attribute 的名稱與綁定的 JavaScript 值的名稱相同,那么可以進一步簡化語法,省略 attribute 值:

<!-- 與 :id="id" 相同 -->
<div :id></div><!-- 這也同樣有效 -->
<div v-bind:id></div>

布爾型 Attribute

布爾型 attribute依據 true / false 值來決定 attribute 是否應該存在于該元素上。disabled就是最常見的例子之一。

v-bind 在這種場景下的行為略有不同:

<button :disabled="isButtonDisabled">Button</button>

isButtonDisabled 為[真值]或一個空字符串 (即 <button disabled="">) 時,元素會包含這個 disabled attribute。而當其為其他[假值]時 attribute 將被忽略。

動態綁定多個值

如果你有像這樣的一個包含多個 attribute 的 JavaScript 對象:

const objectOfAttrs = {id: 'container',class: 'wrapper'
}

通過不帶參數v-bind,你可以將它們綁定到單個元素上:

<div v-bind="objectOfAttrs"></div>

使用 JavaScript 表達式

至此,我們僅在模板中綁定了一些簡單的屬性名。但是 Vue 實際上在所有的數據綁定中都支持完整的 JavaScript 表達式:

{{ number + 1 }}{{ ok ? 'YES' : 'NO' }}{{ message.split('').reverse().join('') }}<div :id="`list-${id}`"></div>

這些表達式都會被作為 JavaScript ,以當前組件實例為作用域解析執行。

在 Vue 模板內,JavaScript 表達式可以被使用在如下場景上:

  • 在文本插值中 (雙大括號)
  • 在任何 Vue 指令 (以 v- 開頭的特殊 attribute) attribute 的值中

僅支持表達式

每個綁定僅支持單一表達式,也就是一段能夠被求值的 JavaScript 代碼。一個簡單的判斷方法是是否可以合法地寫在 return 后面。

因此,下面的例子都是無效的:

<!-- 這是一個語句,而非表達式 -->
{{ var a = 1 }}<!-- 條件控制也不支持,請使用三元表達式 -->
{{ if (ok) { return message } }}

調用函數

可以在綁定的表達式中使用一個組件暴露的方法:

<time :title="toTitleDate(date)" :datetime="date">{{ formatDate(date) }}
</time>

綁定在表達式中的方法在組件每次更新時都會被重新調用.

受限的全局訪問

模板中的表達式將被沙盒化,僅能夠訪問到[有限的全局對象列表]。該列表中會暴露常用的內置全局對象,比如 MathDate

沒有顯式包含在列表中的全局對象將不能在模板內表達式中訪問,例如用戶附加在 window 上的屬性。然而,你也可以自行在 app.config.globalProperties上顯式地添加它們,供所有的 Vue 表達式使用。

指令 Directives

指令是帶有 v- 前綴的特殊 attribute。Vue 提供了許多[內置指令],包括上面我們所介紹的 v-bindv-html

指令 attribute 的期望值為一個 JavaScript 表達式 (除了少數幾個例外,即之后要討論到的 v-forv-onv-slot)。一個指令的任務是在其表達式的值變化時響應式地更新 DOM。以 [v-if]為例:

<p v-if="seen">Now you see me</p>

這里,v-if 指令會基于表達式 seen 的值的真假來移除/插入該 <p> 元素。

參數 Arguments

某些指令會需要一個“參數”,在指令名后通過一個冒號隔開做標識。例如用 v-bind 指令來響應式地更新一個 HTML attribute:

<a v-bind:href="url"> ... </a><!-- 簡寫 -->
<a :href="url"> ... </a>

這里 href 就是一個參數,它告訴 v-bind 指令將表達式 url 的值綁定到元素的 href attribute 上。在簡寫中,參數前的一切 (例如 v-bind:) 都會被縮略為一個 : 字符。

另一個例子是 v-on 指令,它將監聽 DOM 事件:

<a v-on:click="doSomething"> ... </a><!-- 簡寫 -->
<a @click="doSomething"> ... </a>

這里的參數是要監聽的事件名稱:clickv-on 有一個相應的縮寫,即 @ 字符。我們之后也會討論關于事件處理的更多細節。

動態參數

同樣在指令參數上也可以使用一個 JavaScript 表達式,需要包含在一對方括號內:

<!--
注意,參數表達式有一些約束,
參見下面“動態參數值的限制”與“動態參數語法的限制”章節的解釋
-->
<a v-bind:[attributeName]="url"> ... </a><!-- 簡寫 -->
<a :[attributeName]="url"> ... </a>

這里的 attributeName 會作為一個 JavaScript 表達式被動態執行,計算得到的值會被用作最終的參數。舉例來說,如果你的組件實例有一個數據屬性 attributeName,其值為 "href",那么這個綁定就等價于 v-bind:href

相似地,你還可以將一個函數綁定到動態的事件名稱上:

<a v-on:[eventName]="doSomething"> ... </a><!-- 簡寫 -->
<a @[eventName]="doSomething"> ... </a>

在此示例中,當 eventName 的值是 "focus" 時,v-on:[eventName] 就等價于 v-on:focus

動態參數值的限制

動態參數中表達式的值應當是一個字符串,或者是 null。特殊值 null 意為顯式移除該綁定。其他非字符串的值會觸發警告。

動態參數語法的限制

動態參數表達式因為某些字符的緣故有一些語法限制,比如空格和引號,在 HTML attribute 名稱中都是不合法的。例如下面的示例:

<!-- 這會觸發一個編譯器警告 -->
<a :['foo' + bar]="value"> ... </a>

如果你需要傳入一個復雜的動態參數,我們推薦使用[計算屬性]替換復雜的表達式,也是 Vue 最基礎的概念之一,我們很快就會講到。

當使用 DOM 內嵌模板 (直接寫在 HTML 文件里的模板) 時,我們需要避免在名稱中使用大寫字母,因為瀏覽器會強制將其轉換為小寫:

<a :[someAttr]="value"> ... </a>

上面的例子將會在 DOM 內嵌模板中被轉換為 :[someattr]。如果你的組件擁有 “someAttr” 屬性而非 “someattr”,這段代碼將不會工作。單文件組件內的模板受此限制。

修飾符 Modifiers

修飾符是以點開頭的特殊后綴,表明指令需要以一些特殊的方式被綁定。例如 .prevent 修飾符會告知 v-on 指令對觸發的事件調用 event.preventDefault()

<form @submit.prevent="onSubmit">...</form>

指令語法圖

關注我,不迷路,共學習,同進步

關注我,不迷路,共學習,同進步
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/13415.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/13415.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/13415.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

開發vue3,真的可以不用ref/reactive了,也不需要ref.value

什么是Cabloy-Front&#xff1f; Cabloy-Front 是一款支持 IOC 容器的 Vue3 框架。不用ref/reactive&#xff0c;不用ref.value&#xff0c;不用pinia 與UI庫的配合 Cabloy-Front 可以搭配任何 UI 庫使用&#xff0c;并且內置了幾款 UI 庫的項目模版&#xff0c;便于開箱即用…

免費SSL證書簽發安裝指南

一、簽發 1.選擇證書頒發機構&#xff08;CA&#xff09;&#xff1a;首先&#xff0c;你需要找到一個提供免費SSL證書的CA。有些CA會提供永久免費的SSL證書&#xff0c;而有些則可能只提供有限時間的試用證書&#xff0c;如JoySSL就提供永久免費證書。 2.生成CSR&#xff08…

WPF 鼠標拖拽平移

效果 xaml <ScrollViewer x:Name"scrollViewer" HorizontalScrollBarVisibility"Hidden" VerticalScrollBarVisibility"Disabled" Background"#FFF1ADAD"PreviewMouseDown"ScrollViewer_OnPreviewMouseDown"PreviewMou…

Electron學習筆記(一)

文章目錄 相關筆記筆記說明 一、輕松入門 1、搭建開發環境2、創建窗口界面3、調試主進程 二、主進程和渲染進程1、進程互訪2、渲染進程訪問主進程類型3、渲染進程訪問主進程自定義內容4、渲染進程向主進程發送消息5、主進程向渲染進程發送消息6、多個窗口的渲染進程接收主進程發…

白鯨開源CEO郭煒在2024 DataOps發展大會上獲聘專家

2024年5月15日&#xff0c;白鯨開源CEO郭煒在2024 DataOps發展大會上被正式聘任為DataOps專家&#xff0c;并獲得了榮譽證書。本次大會由中國通信標準化協會主辦&#xff0c;中關村科學城管委會提供支持&#xff0c;大數據技術標準推進委員會&#xff08;CCSATC601&#xff09;…

iisnginx環境一次奇怪的跨域問題解決經過

跨域問題描述&#xff1a; iis網站跨域、nginx 網站跨域 都已配置&#xff0c;訪問接口依然出現跨域問題。 錯誤提示&#xff1a; ccess to XMLHttpRequest at ‘https://xxx.com/gameapi/preserve/get/status’ from origin ‘https://cdn.xxx.com’ has been blocked by CO…

Python簡易信息管理系統

我們將通過一個實例來探討如何使用Python與MySQL數據庫進行交互&#xff0c;以構建一個簡單的學生信息管理系統。這個系統將能夠執行基本的CRUD&#xff08;創建(Create)、讀取(Retrieve)、更新(Update)、刪除(Delete)&#xff09;操作&#xff0c;以管理學生信息。我們將使用m…

Python爬蟲-批量爬取新能源汽車上牌量

前言 本文是該專欄的第27篇,后面會持續分享python爬蟲干貨知識,記得關注。 最近粉絲朋友咨詢新能源汽車上牌量數據的爬取方法,對此在本文中,筆者以某汽車平臺為例,通過python來實現對“新能源汽車上牌量”的數據進行抓取。 具體實現思路和詳細邏輯,筆者將在正文結合完整…

三豐云搭建QQ-bot的服務器-代碼實現(3)

網址&#xff1a;https://www.sanfengyun.com >> 三豐云免費云服務器 代碼實現 書接上回裝飾器&#xff0c;顯而易見&#xff0c;只有裝飾器還不完善&#xff0c;所以我們接著來補充代碼 首先定義一個 MyClient 類 class MyClient(botpy.Client):async def on_ready(…

Nacos :安裝配置、服務注冊

目錄 一、中文官網 二、配置 1、application.properties 2、啟動 Nacos 服務 3、訪問 Nacos 三、服務注冊 1、配置Nacos客戶端的pom依賴 2、添加服務配置信息 3、添加 Nacos 啟動注解 一、中文官網 Nacos官網 | Nacos 官方社區 | Nacos 下載 | Nacos 下載后直接解壓…

0X JavaSE-- ( 遍歷-- for each、Iterator 、)、

for each for each 語句是 JDK5 的新特征&#xff0c;主要用于遍歷數組、集合。 // collection 可以是數組/實現了 Iterable 接口的集合類 for(dataType variable : collection){ // 使用 item 進行操作 } // 遍歷二維數組// 初始化一個二維數組int[][] array {{1, 2, 3},{4…

GO語言核心30講 實戰與應用 (io包,bufio包,os包,網絡服務,http,性能分析)

原站地址&#xff1a;Go語言核心36講_Golang_Go語言-極客時間 一、io包中的接口和工具 1. strings.Builder、strings.Reader 和 bytes.Buffer 這些類型實現了 io 包的很多接口&#xff0c;目的是什么&#xff1f; 是為了提高不同程序實體之間的互操作性。 程序實體是指比如網…

瀏覽器插件Video Speed Controller(視頻倍速播放),與網頁自身快捷鍵沖突/重復/疊加的解決辦法

瀏覽器插件Video Speed Controller&#xff08;視頻倍速播放&#xff09;&#xff0c;與網站自身快捷鍵沖突/重復/疊加的解決辦法 插件介紹問題曾今嘗試的辦法今日發現插件列表中打開Video Speed Controller的設置設置頁面翻到下面&#xff0c;打開實驗性功能。將需要屏蔽的原網…

網絡工程師----第三十一天

DNS&#xff1a; DNS含義&#xff1a;DNS 是 Domain Name System&#xff08;域名解析系統&#xff09; 端口號&#xff1a;DNS為53&#xff08;UDP&#xff09; 域名的層次結構&#xff1a; 域名的分級&#xff1a; 域名服務器&#xff1a; 域名解析過程&#xff1a; 遞歸查…

PHP xdebug

使用場景 一臺MAC上安裝了phpstorm&#xff0c;虛擬機安裝了對應的web程序&#xff0c;需要調試。 坑點&#xff0c;網上教程太多&#xff0c;不如看官網&#xff0c;需要按照xdebug版本來配置php.ini https://www.jetbrains.com/help/phpstorm/2023.3/configuring-xdebug.htm…

【Java】HOT100+代碼隨想錄 動態規劃(上)背包問題

目錄 理論基礎 一、基礎題目 LeetCode509&#xff1a;斐波那契數 LeetCode70&#xff1a;爬樓梯 LeetCode746&#xff1a;使用最小花費爬樓梯 LeetCode62&#xff1a;不同路徑 LeetCode63&#xff1a;不同路徑ii LeetCode343&#xff1a;整數拆分 LeetCode96&#xff1a;不…

vue uniapp 小程序 判斷日期是今天(顯示時分秒)、昨天、本周的周幾、超出本周顯示年月日

效果圖&#xff1a; util.js /*** 轉換時間*/ const messageFormat (datetime) >{ let result "";let currentTime new Date();if(isToday(datetime)){result datetime.substring(11,16);}else if(isYesterday(datetime)){result "昨天";}else if(…

分層解耦-三層架構

分層解耦-三層架構 Controller&#xff1a;控制層&#xff0c;接收前端發送的請求&#xff0c;對請求進行處理&#xff0c;并響應數據 service&#xff1a;業務邏輯層&#xff0c;處理具體的業務邏輯 dao&#xff1a;數據訪問層&#xff08;持久層&#xff09;&#xff0c;負…

python爬蟲[簡易版]

python爬數據[簡易版] 對于每個網站的爬的原理基本是一樣的,但是具體的代碼寫法的區別就在于爬的數據中解析出想要的數據格式: 以爬取有道詞典中的圖片為例: 第一步:打開網站,分析圖片的數據源來自哪里, https://dict-subsidiary.youdao.com/home/content?invalid&pre…

操作系統磁盤管理類問題

例題&#xff1a;在磁盤上存儲數據的排列方式會影響1/0服務的總時間。假設每個磁道被劃分成10個物理塊&#xff0c;每個物理塊存放1個邏輯記錄。邏輯記錄R1,R2....R10存放在同一個磁道上&#xff0c;記錄的排列順序如下表所示&#xff1a; 假定磁盤的旋轉速度為10ms/周&#xf…