Vue 模板、指令與修飾符

Vue的模版語(yǔ)法

我們把HTMl模版叫做template蠕趁。

template的3種寫(xiě)法

1' Vue完整版,寫(xiě)在HTML里

html
<div id=xxx>
  {{n}}
  <button @click="add"> + 1 </button>
</div>

new Vue({ //把html變成DOM節(jié)點(diǎn)
  el:'#xxx',
  data:{n:0}, //data可以改成函數(shù)
  methods:{
    add(){}
  }
})

2' Vue完整版,寫(xiě)在選項(xiàng)里

<div id='app'>
</div>

new Vue({
  template:`
  <div>
  {{n}}
  <button @click="add"> + 1 </button>
  </div>
  `,
  data:{n:0}, //data可以改成函數(shù)
  methods:{ add(){ this.n +=1 } }
}).$mount('#app')

注意細(xì)節(jié):
(1)div#app會(huì)被替代
new Vue({})運(yùn)行后垃它,template里面的<div>會(huì)替換掉頁(yè)面的<div id='app'>,渲染完后就沒(méi)有id='app'<div>了。
(2) el:'#xxx'可以替換成new Vue({}).$mount('#app')

3' Vue非完整版,配合x(chóng)xx.vue文件

第1步.寫(xiě)xxx.vue文件
<template>
  <div> //這里一般不需要id,id一般是用來(lái)掛載的肉盹,這里不需要
    {{n}}
    <button @click="add">
      +1
    </button>
  </div>
</template>
注意:<template>里面不是HTML而是 XML
<script>
  export default { //默認(rèn)導(dǎo)出一個(gè)選項(xiàng)(構(gòu)造選項(xiàng))
    data(){ return {n:0} },//data必須為函數(shù)昔驱,這個(gè)函數(shù)返回的對(duì)象就是我們要用的data
    methods:{add(){ this.n += 1 }}
  }
</script>
<style>
  這里寫(xiě) CSS 
</style>

第2步.在另外一個(gè)地方寫(xiě)如下代碼
import Xxx from './xxx.vue' 
//首字母大寫(xiě)防沖突,Xxx是一個(gè)options對(duì)象
new Vue({
  render: h => h(Xxx) //Xxx傳給Vue的render函數(shù)
  }).$mount('#app')

Xxx就是導(dǎo)出的對(duì)象 export default { 對(duì)象 }

HTML與XML的區(qū)別:
XML書(shū)寫(xiě)更嚴(yán)格:所有空標(biāo)簽都可以直接閉合上忍,比如<div />骤肛,必須寫(xiě)/。
因此XMl語(yǔ)法更容易寫(xiě)編譯器窍蓝。

模版里有哪些語(yǔ)法腋颠?

一.展示內(nèi)容

1.表達(dá)式

{{ object.a }} 表達(dá)式。data里面的object.a
{{ n+1 }} 可以寫(xiě)任何運(yùn)算它抱。但不支持if...else
{{ fn(n) }} 可以調(diào)用函數(shù)秕豫。默認(rèn)在methods里找叫fn的函數(shù),并傳了參數(shù)n
當(dāng)值是`undefined 或 null`時(shí),它就什么都不展示,它不會(huì)顯示undefined和
null观蓄,這是Vue的特殊處理混移。
另一種寫(xiě)法為<div v-text="表達(dá)式"></div> 很少有人用

2.HTMl內(nèi)容

指令v-html="",支持內(nèi)容里有html標(biāo)簽侮穿。

假設(shè)data.x值為<strong>hi</strong>
<div v-html="x"></div>即可顯示粗體的hi
3.我就想在頁(yè)面中展示{{n}}怎么辦歌径?

<div v-pre> {{ n }} </div> //v-pre不會(huì)對(duì)模版進(jìn)行編譯

二.綁定屬性

1.綁定字符串
綁定src:<img :src="x" />
補(bǔ)充:<img v-bind:src="x" />其中v-bind:可以簡(jiǎn)寫(xiě)為:
2.綁定對(duì)象

<div
 :style="{border:'1px solid red',height:100}">
</div>
//注意在這里可以把'100px'寫(xiě)成100
//補(bǔ)充:JS中100就是100px div.style.height=100 //'100px'
//這種寫(xiě)法會(huì)在div上寫(xiě)一個(gè)內(nèi)聯(lián)樣式

三.綁定事件 v-on

v-on就是在什么時(shí)候觸發(fā)事件。

v-on:事件名
[圖片上傳失敗...(image-a9684b-1649271111233)]
縮寫(xiě)<button @click=""add> +1 </button>

四.條件判斷 v-if

<div v-if="x>0">
  x大于0
</div> 
<div v-else-if="x===0">
  x為0
</div> 
<div v-else>
  x小于0
</div> 

v-if是什么時(shí)候出現(xiàn)在DOM樹(shù)里亲茅。

五.循環(huán) v-for

for(value,key)in 對(duì)象或數(shù)組
注意:每一個(gè)v-for必須有:key="" 綁定一個(gè)變量回铛,不寫(xiě)就會(huì)有警告!

數(shù)組的例子
<ul>
  <li v-for="(u,index) in users" :key="index"> 
    索引:{{index}} 值:{{u.name}}
  </li>
</ul>

對(duì)象的例子
<ul>
  <li v-for="(value, name) in obj" :key="name">
    屬性名:{{name}},屬性值:{{value}}
  </li>
</ul>

六.顯示克锣、隱藏 v-show

<div v-show="n%2===0"> n是偶數(shù) </div>
//表達(dá)式如果是真的就顯示<div>茵肃,負(fù)責(zé)就不顯示<div>。if...else的簡(jiǎn)化版
//如果是假的<div>就不會(huì)出現(xiàn)在頁(yè)面

v-show是什么時(shí)候展示出來(lái)袭祟,是通過(guò)css隱藏的验残。

七.v-once

只渲染元素和組件一次。隨后的重新渲染巾乳,元素/組件及其所有的子節(jié)點(diǎn)將被視為靜態(tài)內(nèi)容并跳過(guò)您没。這可以用于優(yōu)化更新性能鸟召。

<!-- 單個(gè)元素 -->
<span v-once>This will never change: {{msg}}</span>
<!-- 有子元素 -->
<div v-once>
  <h1>comment</h1>
  <p>{{msg}}</p>
</div>
<!-- 組件 -->
<my-component v-once :comment="msg"></my-component>
<!-- `v-for` 指令-->
<ul>
  <li v-for="i in list" v-once>{{i}}</li>
</ul>

總結(jié)

Vue模版主要特點(diǎn)有
1.使用XML語(yǔ)法(不是HTML)
2.使用{{}}插入表達(dá)式
3.使用v-html、v-on氨鹏、v-bind等指令操作DOM
4.使用v-if欧募、v-for等指令實(shí)現(xiàn)條件判斷和循環(huán)

指令與修飾符

一.指令Directive
1.什么是指令
v-開(kāi)頭的東西就是指令。
2.語(yǔ)法
[圖片上傳失敗...(image-ec6998-1649271111233)]

<a @click.prevent href="">百度</a>

二.修飾符

用來(lái)修飾一個(gè)指令的就叫修飾符仆抵,比如.prevent跟继。
有些指令支持修飾符,但有些不支持镣丑,看文檔还栓。
[圖片上傳失敗...(image-5fcfa2-1649271111233)]

1.添加修飾符
v-on支持的修飾符最多,比如.keycode
需求:如果用戶(hù)打回車(chē)就單獨(dú)給它個(gè)邏輯传轰。

new Vue({
  template: `
  <div>
    <input @keypress.13="y"/> 
<!--<input @keypress.enter="y"/>-->  
  </div>
  `,
  methods: {
    y(e) {
      console.log(e);
      console.log("用戶(hù)打了回車(chē)鍵"); 
    }
  }
}).$mount("#app");
<input @keypress.13="y"/>或者<input @keypress.13=y /> 

2.縮寫(xiě)alias
鍵盤(pán)編碼難記可以用縮寫(xiě)alias,查看支持的按鍵碼

 <input @keypress.enter="y"/> //給13取個(gè)別名enter

[圖片上傳失敗...(image-70e4f3-1649271111233)]

上面這幾個(gè)都不用記編碼谷婆,可以直接用別名慨蛙。

事件修飾符.self(很少用)
用戶(hù)點(diǎn)的元素正好是你監(jiān)聽(tīng)的那個(gè)元素才會(huì)觸發(fā),如果是元素里面的元素不會(huì)觸發(fā)纪挎。

知識(shí)點(diǎn)
1.事件
input輸入事件
只要輸入東西到input里都會(huì)觸發(fā)事件<input @input="y"/>
keypress鍵盤(pán)按下事件
只要按下鍵盤(pán)就會(huì)觸發(fā)事件y <input @keypress="y"/>
2..prevent阻止默認(rèn)動(dòng)作

<a @click.prevent='x' >百度</a>

3..stop阻止事件傳播/冒泡

@click.stop='add'

.sync 修飾符(重要)

main.js
// 此處是非完整版vue
import Vue from "vue";
import App from "./App.vue";
Vue.config.productionTip = false;

new Vue({
  render: h => h(App)
}).$mount("#app");

App.vue
<template>
  <div class="app">
    App.vue 我現(xiàn)在有 {{total}}
    <hr>
    <Child :money="total" v-on:update:money="total = $event"/>
  //<Child :money.sync="total" />
  </div>
</template>

<script>
import Child from "./Child.vue";
export default {
  data() {
    return { total: 10000 };
  },
  components: { Child: Child }
};
</script>

<style>
.app {
  border: 3px solid red;
  padding: 10px;
}
</style>

Child.vue 
//子組件
<template>
  <div class="child">
    {{money}}
    <button @click="$emit('update:money', money-100)">
      <span>花錢(qián)</span>
    </button>
  </div>
</template>

<script>
export default {
  props: ["money"]
};
</script>

<style>
.child { border: 3px solid green; }
</style>

解析:
1.main.js渲染了App,App是個(gè)組件期贫。
2.App.vue
紅色邊框是App組件。
<Child />是子組件從文件Child.vue來(lái)的异袄,import Child from "./Child.vue"; 使用時(shí)要聲明下components: { Child: Child }告訴它總金額就1萬(wàn)total: 10000再多沒(méi)有通砍。
3.Child.vue
<Child />需要接收這筆錢(qián),props: ["money"]外部數(shù)據(jù)money烤蜕,所以App.vue<Child :money="total" />把總金額告訴Child.vue封孙。

當(dāng)點(diǎn)擊button時(shí)就是要花錢(qián),花的是他爸的錢(qián)(操作外部數(shù)據(jù))所以不能<button @click="money -=100">自己操作數(shù)據(jù)讽营。
MVC章節(jié)講過(guò)訂閱發(fā)布系統(tǒng)eventBus虎忌,Vue內(nèi)置了eventBus,所以我們可以使用當(dāng)前實(shí)例this,this就是當(dāng)前實(shí)例,當(dāng)前實(shí)例繼承了eventBus橱鹏,所以它可以觸發(fā)一個(gè)事件膜蠢。所以@click="this.$emit",因?yàn)樵赩ue template里this可以刪掉所以<button @click="$emit('useMoney',money-100)">

他爸就要監(jiān)聽(tīng)他兒子要不要錢(qián)莉兰,如果發(fā)現(xiàn)兒子觸發(fā)了我要錢(qián)挑围,那就把他花的錢(qián)賦值給我的data的total,那我怎么知道兒子給我的錢(qián)是多少呢糖荒?尤雨溪把這個(gè)值存到變量上杉辙,你只要使用這個(gè)就可以了,這個(gè)變量就是$event寂嘉。原理:把它的那個(gè)值先存到我的組件$event上奏瞬,用時(shí)自己取枫绅。所以App.vue<Child :money='total' v-on:useMoney = "total = $event"/>
尤雨溪規(guī)定要把事件名改為'update:money'
有人在<Child/>上調(diào)用了on,有人在<Child/>上調(diào)用了$emit,這就是事件的發(fā)布和訂閱。

這種方法很常見(jiàn)硼端,v-on:update:money = "total = $event"監(jiān)聽(tīng)事件(update:money)獲取$event并淋,所以被封裝成了修飾符.sync
寫(xiě)法

<Child :money.sync='total'/>
//等于<Child :money='total' v-on:useMoney = "total = $event"/>

.sync這種寫(xiě)法就是一個(gè)語(yǔ)法糖或者API糖珍昨。

總結(jié)

@click.stop="xxx"
@click.prevent="xxx"
@keypress.enter="xxx"
:money.sync="total"
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末县耽,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子镣典,更是在濱河造成了極大的恐慌兔毙,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件兄春,死亡現(xiàn)場(chǎng)離奇詭異澎剥,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)赶舆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)哑姚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人芜茵,你說(shuō)我怎么就攤上這事叙量。” “怎么了九串?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵绞佩,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我猪钮,道長(zhǎng)品山,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任烤低,我火速辦了婚禮谆奥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘拂玻。我一直安慰自己酸些,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布檐蚜。 她就那樣靜靜地躺著魄懂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪闯第。 梳的紋絲不亂的頭發(fā)上市栗,一...
    開(kāi)封第一講書(shū)人閱讀 51,708評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼填帽。 笑死蛛淋,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的篡腌。 我是一名探鬼主播褐荷,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼嘹悼!你這毒婦竟也來(lái)了叛甫?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤杨伙,失蹤者是張志新(化名)和其女友劉穎其监,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體限匣,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡抖苦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了米死。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片睛约。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖哲身,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情贸伐,我是刑警寧澤勘天,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站捉邢,受9級(jí)特大地震影響脯丝,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜伏伐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一宠进、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧藐翎,春花似錦材蹬、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至末贾,卻和暖如春闸溃,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工辉川, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留表蝙,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓乓旗,卻偏偏與公主長(zhǎng)得像府蛇,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子寸齐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

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

  • 模板template三種寫(xiě)法 一. Vue完整版渺鹦,寫(xiě)在HTML中 二. Vue完整版扰法,寫(xiě)在選項(xiàng)里 三. Vue非完...
    Marshall3572閱讀 106評(píng)論 0 0
  • 1.template的三種用法 使用Vue完整版,寫(xiě)在HTML里面 2.使用Vue完整版毅厚,寫(xiě)在選項(xiàng)里面 這樣寫(xiě)有一...
    雨溪灘閱讀 223評(píng)論 0 2
  • Vue 模板 Vue 完整版塞颁,寫(xiě)在 HTML 中 Vue 完整版,寫(xiě)在選項(xiàng)里 非完整版 Vue吸耿,配合使用 demo...
    是周大俠啊閱讀 160評(píng)論 0 0
  • 指令是以 v-為前綴的特殊屬性 v-bind簡(jiǎn)寫(xiě): v-on簡(jiǎn)寫(xiě)@ v-pre v-text v-html v-i...
    我是Msorry閱讀 309評(píng)論 0 0
  • 指令: 以 v- 開(kāi)頭的就是指令 指令語(yǔ)法: v- 指令名:參數(shù) = 值 eg. v-on:click = ...
    小芬芬007閱讀 186評(píng)論 0 0