Vue.js基礎(chǔ) - 指令

指令用在我們的html中檐盟。

指令 (Directives) 是帶有?v-?前綴的特殊特性。指令特性的值預(yù)期是單個 JavaScript 表達式?(v-for?是例外情況押桃,稍后我們再討論)葵萎。指令的職責是,當表達式的值改變時唱凯,將其產(chǎn)生的連帶影響羡忘,響應(yīng)式地作用于 DOM。


v-if指令:

用來判斷是否加載html的DOM

根據(jù)表達式的值的真假條件渲染元素磕昼。在切換時元素及它的數(shù)據(jù)綁定 / 組件被銷毀并重建卷雕。如果元素是?<template>?,將提出它的內(nèi)容作為條件塊票从。

當條件變化時該指令觸發(fā)過渡效果漫雕。

當和?v-if?一起使用時,v-for?的優(yōu)先級比?v-if?更高峰鄙。詳見列表渲染教程


v-else指令:

前一兄弟元素必須有?v-if?或?v-else-if浸间。

為?v-if?或者?v-else-if?添加“else 塊”。

<div v-if="Math.random() > 0.5">

Now you see me

</div>

<div v-else>

Now you don't

</div>


v-else-if指令:

前一兄弟元素必須有?v-if?或?v-else-if先馆。

表示?v-if?的 “else if 塊”发框。可以鏈式調(diào)用煤墙。

<div v-if="type === 'A' ">

????A

</div>

<div v-else-if="type === 'B' ">

????B

</div>

<div v-lese>

????Not? A/B

</div>


v-show指令:

根據(jù)表達式之真假值梅惯,切換元素的?display?CSS 屬性。

當條件變化時該指令觸發(fā)過渡效果仿野。


v-for指令:

循環(huán)渲染一組data中的數(shù)組铣减,v-for 指令需要以 item in items 形式的特殊語法,items 是源數(shù)據(jù)數(shù)組并且item是數(shù)組元素迭代的別名脚作。

基于源數(shù)據(jù)多次渲染元素或模板塊葫哗。此指令之值缔刹,必須使用特定語法?alias in expression,為當前遍歷的元素提供別名:

<div v-for="item in items">

????{{item.text}}

</div>

另外也可以為數(shù)組索引指定別名 (或者用于對象的鍵):

<div v-for="(item,index) in items"></div>

<div v-for="(val,key) in object"></div>

<div v-for="(val,name,index) in object"></div>

v-for?默認行為試著不改變整體劣针,而是替換元素校镐。迫使其重新排序的元素,需要提供一個?key?的特殊屬性:

<div v-for="item in items" :key="item.id">

????{{item.text}}

</div>

從 2.6 起捺典,v-for?也可以在實現(xiàn)了可迭代協(xié)議的值上使用鸟廓,包括原生的?Map?和?Set。不過應(yīng)該注意的是 Vue 2.x 目前并不支持可響應(yīng)的?Map?和?Set?值襟己,所以無法自動探測變更引谜。

當和?v-if?一起使用時,v-for?的優(yōu)先級比?v-if?更高擎浴。詳見列表渲染教程?? ?员咽;? ??key



v-text指令:

更新元素的?textContent。如果要更新部分的?textContent?贮预,需要使用?{{ Mustache }}?插值贝室。

<span v-text="msg"></span>

<span>{{msg}}</span>


v-html指令:

更新元素的?innerHTML?。注意:內(nèi)容按普通 HTML 插入 - 不會作為 Vue 模板進行編譯?仿吞。如果試圖使用?v-html?組合模板档玻,可以重新考慮是否通過使用組件來替代。

在網(wǎng)站上動態(tài)渲染任意 HTML 是非常危險的茫藏,因為容易導(dǎo)致?XSS 攻擊。只在可信內(nèi)容上使用?v-html霹琼,永不用在用戶提交的內(nèi)容上务傲。

單文件組件里,scoped?的樣式不會應(yīng)用在?v-html?內(nèi)部枣申,因為那部分 HTML 沒有被 Vue 的模板編譯器處理售葡。如果你希望針對?v-html?的內(nèi)容設(shè)置帶作用域的 CSS,你可以替換為?CSS Modules?或用一個額外的全局?<style>?元素手動設(shè)置類似 BEM 的作用域策略忠藤。

<div v-html="html"></html>


v-model指令:

綁定數(shù)據(jù)源挟伙。就是把數(shù)據(jù)綁定在特定的表單元素上,可以很容易的實現(xiàn)雙向數(shù)據(jù)綁定模孩。

隨表單控件類型不同而不同尖阔。

修飾符

.lazy?- 取代?input?監(jiān)聽?change?事件

.number?- 輸入字符串轉(zhuǎn)為有效的數(shù)字

.trim?- 輸入首尾空格過濾

在表單控件或者組件上創(chuàng)建雙向綁定。


v-bind指令:

修飾符:

.prop?- 被用于綁定 DOM 屬性 (property)榨咐。(差別在哪里介却?)

.camel?- (2.1.0+) 將 kebab-case 特性名轉(zhuǎn)換為 camelCase. (從 2.1.0 開始支持)

.sync?(2.3.0+) 語法糖,會擴展成一個更新父組件綁定值的?v-on?偵聽器块茁。

處理HTML中的標簽屬性齿坷,用于響應(yīng)式地更新 HTML 特性

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

href?是參數(shù)桂肌,告知?v-bind?指令將該元素的?href?特性與表達式?url?的值綁定。

動態(tài)地綁定一個或多個特性永淌,或一個組件 prop 到表達式崎场。

在綁定?class?或?style?特性時,支持其它類型的值遂蛀,如數(shù)組或?qū)ο筇房纭?梢酝ㄟ^下面的教程鏈接查看詳情答恶。

在綁定 prop 時饺蚊,prop 必須在子組件中聲明⌒ぃ可以用修飾符指定不同的綁定類型污呼。

沒有參數(shù)時,可以綁定到一個包含鍵值對的對象包竹。注意此時?class?和?style?綁定不支持數(shù)組和對象燕酷。

示例

<!-- 綁定一個屬性 -->

<img v-bind:src="imageSrc">

<!-- 動態(tài)特性名 (2.6.0+) -->

<bytton v-bind:[key]="value"></button>

<!-- 縮寫 -->

<img :src="imageSrc">

<!-- 動態(tài)特性名縮寫 (2.6.0+) -->

<button :[key]="value"></button>

<!-- 內(nèi)聯(lián)字符串拼接 -->

<img :src=" '/path/to/images/ ' + fileName">

<!-- class 綁定 -->

<div :class="{ red : isRed }"></div>

<div :class="[classA,classB]"></div>

<div :class="[classA, {classB: isB, classC: isC}]"></div>

<!-- style 綁定 -->

<div :style="{ fontSize: size + ' px ' }"></div>

<div :style="[ styleObjectA, styleObjectB ]"></div>

<!-- 綁定一個有屬性的對象 -->

<div v-bind="{ id: someProp, 'other-attr': otherProp }"></div>

<!-- 通過 prop 修飾符綁定 DOM 屬性 -->

<div v-bind:text-content.prop="text"></div>

<!-- prop 綁定≈芟梗“prop”必須在 my-component 中聲明苗缩。-->

<my-component:prop="someThing"></my-component>

<!-- 通過 $props 將父組件的 props 一起傳給子組件 -->

<child-component v-bind="$props"></child-component>

<!-- XLink -->

<svg> <a :xlink:special="foo"></a></svg>

.camel?修飾符允許在使用 DOM 模板時將?v-bind?屬性名稱駝峰化,例如 SVG 的?viewBox屬性:

<svg:view-box.camel="viewBox"></svg>

在使用字符串模板或通過?vue-loader/vueify?編譯時声诸,無需使用?.camel酱讶。


v-on指令:

修飾符:

.stop?- 調(diào)用?event.stopPropagation()。

.prevent?- 調(diào)用?event.preventDefault()彼乌。

.capture?- 添加事件偵聽器時使用 capture 模式泻肯。

.self?- 只當事件是從偵聽器綁定的元素本身觸發(fā)時才觸發(fā)回調(diào)。

.{keyCode | keyAlias}?- 只當事件是從特定鍵觸發(fā)時才觸發(fā)回調(diào)慰照。

.native?- 監(jiān)聽組件根元素的原生事件灶挟。

.once?- 只觸發(fā)一次回調(diào)。

.left?- (2.2.0) 只當點擊鼠標左鍵時觸發(fā)毒租。

.right?- (2.2.0) 只當點擊鼠標右鍵時觸發(fā)稚铣。

.middle?- (2.2.0) 只當點擊鼠標中鍵時觸發(fā)。

.passive?- (2.3.0) 以?{ passive: true }?模式添加偵聽器

v-on 就是監(jiān)聽事件墅垮,可以用v-on指令監(jiān)聽DOM事件來觸發(fā)一些javascript代碼

綁定事件監(jiān)聽器惕医。事件類型由參數(shù)指定。表達式可以是一個方法的名字或一個內(nèi)聯(lián)語句噩斟,如果沒有修飾符也可以省略曹锨。

用在普通元素上時,只能監(jiān)聽原生 DOM 事件剃允。用在自定義元素組件上時沛简,也可以監(jiān)聽子組件觸發(fā)的自定義事件齐鲤。

在監(jiān)聽原生 DOM 事件時,方法以事件為唯一的參數(shù)椒楣。如果使用內(nèi)聯(lián)語句给郊,語句可以訪問一個?$event?屬性:v-on:click="handle('ok', $event)"。

從?2.4.0?開始捧灰,v-on?同樣支持不帶參數(shù)綁定一個事件/監(jiān)聽器鍵值對的對象淆九。注意當使用對象語法時,是不支持任何修飾器的毛俏。

示例

<!-- 方法處理器 -->

<button v-on:click="doThis"></button>

<!-- 動態(tài)事件 (2.6.0+) -->

<button v-on:[event]="doThis"></button>

<!-- 內(nèi)聯(lián)語句 -->

<button v-on:click="doThat('hello', $event)"></button>

<!-- 縮寫 -->

<button @click="doThis"></button>

<!-- 動態(tài)事件縮寫 (2.6.0+) -->

<button @[event]="doThis"></button>

<!-- 停止冒泡 -->

<button @click.stop="doThis"></button>

<!-- 阻止默認行為 -->

<button @click.prevent="doThis"></button>

<!-- 阻止默認行為炭庙,沒有表達式 -->

<form @submit.prevent></form>

<!-- 串聯(lián)修飾符 -->

<button @click.stop.prevent="doThis"></button>

<!-- 鍵修飾符,鍵別名 -->

<input @keyup.enter="onEnter">

<!-- 鍵修飾符煌寇,鍵代碼 --><input @keyup.13="onEnter">

<!-- 點擊回調(diào)只會觸發(fā)一次 -->

<button v-on:click.once="doThis"></button>

<!-- 對象語法 (2.4.0+) -->

<button v-on="{ mousedown: doThis, mouseup: doThat }"></button>?


在子組件上監(jiān)聽自定義事件 (當子組件觸發(fā)“my-event”時將調(diào)用事件處理器):

<my-component @my-event="handleThis"></my-component>

<!-- 內(nèi)聯(lián)語句 -->

<my-component?@my-event="handleThis(123, $event)"></my-component>

<!-- 組件中的原生事件 -->

<my-component @click.native="onClick"></my-component>


v-slot 指令

縮寫:#

可放置在函數(shù)參數(shù)位置的 JavaScript 表達式 (在支持的環(huán)境下可使用解構(gòu))焕蹄。可選阀溶,即只需要在為插槽傳入 prop 的時候使用腻脏。

參數(shù):插槽名 (可選,默認值是?default)

提供具名插槽或需要接收 prop 的插槽银锻。

示例

<!-- 具名插槽 -->?

<base-layout>

????<template v-slot:header>

????????Header content

????</template>

?????Default slot content

????<template v-slot:header>

?????????Footer content

????</template>

</base-layout>


? <!-- 接收 prop 的具名插槽 -->? ? ? ? ??

<infinite-scroll>??

????<template v-slot:item="slotProps">

????????<div class="item">

????????????{{ slotProps.item.text }}

? ? ????</div>

? </template>

</infinite-scroll>

<!-- 接收 prop 的默認插槽永品,使用了解構(gòu) -->

<mouse-position v-slot="{ x, y }">

? ????Mouse position: {{ x }}, {{ y }}

</mouse-position>


v-pre指令:

在模板中跳過vue的編譯裕循,直接輸出原始值悦施。就是在標簽中加入v-pre就不會輸出vue中的data值了。

跳過這個元素和它的子元素的編譯過程船殉「瘢可以用來顯示原始 Mustache 標簽症见。跳過大量沒有指令的節(jié)點會加快編譯。

<div v-pre>{{message}}</div>

這時并不會輸出我們的message值殃饿,而是直接在網(wǎng)頁中顯示{{message}}


v-cloak指令:

這個指令保持在元素上直到關(guān)聯(lián)實例結(jié)束編譯。和 CSS 規(guī)則如?[v-cloak] { display: none }?一起用時芋肠,這個指令可以隱藏未編譯的 Mustache 標簽直到實例準備完畢乎芳。

在vue渲染完指定的整個DOM后才進行顯示。它必須和CSS樣式一起使用帖池,

[v-cloak]{

????display: none;

}

<div v-cloak>

????{{message}}

</div>

不會顯示奈惑,直到編譯結(jié)束。


v-once指令:

只渲染元素和組件一次睡汹。隨后的重新渲染肴甸,元素/組件及其所有的子節(jié)點將被視為靜態(tài)內(nèi)容并跳過。這可以用于優(yōu)化更新性能囚巴。

在第一次DOM進行渲染時原在,渲染完成后視為靜態(tài)內(nèi)容友扰,跳出以后的渲染過程。

<div v-once>第一次綁定的值:{{message}}</div>

<div><input type="text" v-model="message"></div>

<!-- 單個元素 -->

<span v-once>This will never change: {{msg}}</span>

<!-- 有子元素 -->

<div v-once>

? ? <h1>?comment</h1>

????<p>{{msg}}</p>

</div>

<!-- 組件 -->

<my-componentv-once:comment="msg"> </my-component>

<!-- `v-for` 指令-->

<ul>

????<li v-for=" i in list " v-once> {{i}}</li>

</ul>





動態(tài)參數(shù):?

從 2.6.0 開始庶柿,可以用方括號括起來的 JavaScript 表達式作為一個指令的參數(shù):

<a v-bind:[attributeName]="url">...</a>

attributeName?會被作為一個 JavaScript 表達式進行動態(tài)求值村怪,求得的值將會作為最終的參數(shù)來使用。

例如浮庐,如果你的 Vue 實例有一個?data?屬性?attributeName甚负,其值為?"href",那么這個綁定將等價于?v-bind:href审残。

同樣地梭域,你可以使用動態(tài)參數(shù)為一個動態(tài)的事件名綁定處理函數(shù):

<a v-on:[eventName]="doSomething">...</a>

同樣地,當?eventName?的值為?"focus"?時搅轿,v-on:[eventName]?將等價于?v-on:focus病涨。

對動態(tài)參數(shù)表達式的約束

動態(tài)參數(shù)表達式有一些語法約束,因為某些字符介时,例如空格和引號没宾,放在 HTML 特性名里是無效的。同樣沸柔,在 DOM 中使用模板時你需要回避大寫鍵名循衰。

修飾符

修飾符 (modifier) 是以半角句號?.?指明的特殊后綴,用于指出一個指令應(yīng)該以特殊方式綁定褐澎。例如会钝,.prevent?修飾符告訴?v-on?指令對于觸發(fā)的事件調(diào)用?event.preventDefault():

<form v-on:submit.prevent="onSubmit">...</form>

縮寫:

v-?前綴作為一種視覺提示,用來識別模板中 Vue 特定的特性工三。當你在使用 Vue.js 為現(xiàn)有標簽添加動態(tài)行為 (dynamic behavior) 時迁酸,v-?前綴很有幫助,然而俭正,對于一些頻繁用到的指令來說奸鬓,就會感到使用繁瑣。同時掸读,在構(gòu)建由 Vue 管理所有模板的單頁面應(yīng)用程序 (SPA - single page application)?時串远,v-?前綴也變得沒那么重要了。因此儿惫,Vue 為?v-bind?和?v-on?這兩個最常用的指令澡罚,提供了特定簡寫:

v-bind 縮寫

<!-- 完整語法 -->

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

<!-- 縮寫 -->

<a :href="url">...</a>

v-on 縮寫

<!-- 完整語法 -->

<a v-on:click="doSomething">...</a>

<!-- 縮寫 -->

<a @click="doSomething">...</a>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市肾请,隨后出現(xiàn)的幾起案子留搔,更是在濱河造成了極大的恐慌,老刑警劉巖铛铁,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件隔显,死亡現(xiàn)場離奇詭異却妨,居然都是意外死亡,警方通過查閱死者的電腦和手機荣月,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門管呵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人哺窄,你說我怎么就攤上這事捐下。” “怎么了萌业?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵坷襟,是天一觀的道長。 經(jīng)常有香客問我生年,道長婴程,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任抱婉,我火速辦了婚禮档叔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蒸绩。我一直安慰自己衙四,他們只是感情好,可當我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布患亿。 她就那樣靜靜地躺著传蹈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪步藕。 梳的紋絲不亂的頭發(fā)上惦界,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天,我揣著相機與錄音咙冗,去河邊找鬼沾歪。 笑死,一個胖子當著我的面吹牛雾消,可吹牛的內(nèi)容都是我干的瞬逊。 我是一名探鬼主播,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼仪或,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了士骤?” 一聲冷哼從身側(cè)響起范删,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拷肌,沒想到半個月后到旦,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體旨巷,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年添忘,在試婚紗的時候發(fā)現(xiàn)自己被綠了采呐。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡搁骑,死狀恐怖斧吐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情仲器,我是刑警寧澤煤率,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站乏冀,受9級特大地震影響蝶糯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜辆沦,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一昼捍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧肢扯,春花似錦妒茬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蛛株,卻和暖如春团赁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背谨履。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工欢摄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人笋粟。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓怀挠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親害捕。 傳聞我的和親對象是個殘疾皇子绿淋,可洞房花燭夜當晚...
    茶點故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內(nèi)容