Vue的模板码撰、指令與修飾符

1. 模板 template 的三種寫法

  1. 使用Vue完整版闸餐,寫在HTML里
// index.html
<div id="xxx">
  {{n}}
<button @click="add"><button/>
</div>
// main.js
new Vue({
  el:"#xxx",
  data:{n:0},     // data也可以寫成函數(shù)
  methods:{
    add(){
      ...
    }
  }
})
  1. 使用Vue完整版饱亮,寫在選項(xiàng)里
// index.html
<div id="app">
</div>
// main.js
new Vue({
  data:{n:0},     // data也可以寫成函數(shù)
  tmeplate:`
    <div id="xxx">
      {{n}}
    <button @click="add"><button/>
  </div>
  `,
  methods:{
    add(){
      ...
    }
  }
}).$mount('#app')  // 等于 el:'#app'
  • 這樣寫,HTML里面的 div#app 元素會(huì)被 template 外層的 div 替換舍沙。
  1. 使用 Vue 非完整版近上,配合 xxx.vue 文件
<template>  <!-- 這里不是HTML,而是 XML -->
    <div>
        {{n}}
        <button @click='add'>+1</button>
    </div>
</template>
<!-- XML中 有閉合標(biāo)簽 / 比如 <input /> <div />  空div可以這樣寫 -->
<script>
export default {
  data(){ return n:0 }  // data必須為函數(shù)
  method: {add(){ this.n += 1 }}
}
</script>
<style> 這里寫CSS樣式 </style>
// 在另一個(gè)地方寫如下代碼
import Xxx from './xxx.vue'
// Xxx
是一個(gè) options 對(duì)象
new Vue({
  render: h => h{Xxx}
}),$mount('#app')

2. 模板 template 中的常用指令

2.1 展示內(nèi)容

  1. 表達(dá)式
  • {{ object.a }} 表達(dá)式
  • {{ n+1 }} 可以寫任何運(yùn)算(不能寫if else)
  • {{ fn(n) }} 可以調(diào)用函數(shù)
  • 如果值為 undefined 或 null 就不顯示
  • 另一種寫法
<div v-text="表達(dá)式"></div> 
  1. HTML內(nèi)容
  • 假設(shè) data.x 值為 <strong>hi</strong>
<div v-html="x"></div>   <!-- 即可顯示粗體的hi -->
  1. 展示內(nèi)容{{ n }}
<div v-pre>{{ n }}</div>
  • v-pre 不會(huì)對(duì)模板進(jìn)行編譯

2.2 綁定屬性

1.綁定 src

<img v-bind:src='x' />
  • v-bind: 簡(jiǎn)寫為<img :src="x" />
  • 綁定對(duì)象
<div :style="{borde: '1px solid red', height: 100}"></div>

注意:這里可以把‘100px’寫成100拂铡,默認(rèn)為px壹无,如果是'100em'就不可以省略em。

2.3 綁定事件

1.v-on:事件名

<button v-on:click="add">+1</button>    <!-- 點(diǎn)擊之后和媳,Vue 會(huì)運(yùn)行 add() -->
<button v-on:click="xxx(1)">xxx</button>  <!-- 點(diǎn)擊之后格遭,Vue 會(huì)運(yùn)行 xxx(1) -->
<button v-on:click="n+=1">xxx</button>  <!-- 點(diǎn)擊之后,Veu 會(huì)運(yùn)行n+=1 -->

發(fā)現(xiàn)函數(shù)就加括號(hào)調(diào)用留瞳,否則就直接運(yùn)行代碼拒迅。為了在模板 template 中保持簡(jiǎn)便容易理解的代碼,還是避免使用函數(shù)中再調(diào)用函數(shù)這樣的偏復(fù)雜操作她倘。
2.縮寫

<button @click="add">+1</button>  <!-- 一般都會(huì)使用縮寫 -->

2.4 條件判斷

if...else

<div v-if="x >0"> <!-- 符合條件就顯示div -->
    x大于0
</div>
<div v-else-if="x ===0">
    x為0
</div>
<div v-else>
    x小于0
</div>

2.5 循環(huán)

  • for (value, key) in 對(duì)象或數(shù)組
<ul>
    <li v-for=" (u,index) in users" :key="index">
        索引:{{index}}值:{{u.name}}
    </li>
</ul>

<ul>
    <li v-for=" (value, name) in obj" :key="name" >
        屬性名:{{name}}璧微,屬性值:{{name}}
    </li>
</ul>

2.6 顯示與隱藏

  • v-show
<div v-show="n%2===0"> n是偶數(shù) </div>
<!-- 近似等于 -->
<div :style="{display:n%2===0?'block:'none'}">n是偶數(shù)</div>

但是看得見的元素display不止有block,如 table 的 display 為table硬梁,li 的 display 為 list-item前硫。

3. 指令通用用法

3.1 什么是指令

以 v- 開頭的東西就是指令。(只有v-bind和v-on會(huì)省略)

3.2 語法

  • v-指令名: 參數(shù)=值荧止,如 v-on:click=add
  • 如果參數(shù)值沒有特殊字符屹电,則可以不加引號(hào)
  • 有些指令沒有參數(shù)和值,如 v-pre
  • 有些指令沒有值跃巡,如 v-on:click.prevent (阻止默認(rèn)事件)
    總結(jié)
    1.Vue模板主要特點(diǎn)有
  • 使用 XML 語法(不是HTML)
  • 使用 {{}} 插入表達(dá)式
  • 使用 v-html v-on v-bind 等指令操作DOM
  • 使用 v-if v-for 等指令視線條件判斷和循環(huán)
    2.還沒寫出來的指令
  • v-model 關(guān)于Vue表單
  • v-slot 關(guān)于Vue插槽
  • v-cloak
    這個(gè)指令保持在元素上直到關(guān)聯(lián)實(shí)例結(jié)束編譯危号。和 CSS 規(guī)則如 [v-cloak] { display: none } 一起用時(shí),這個(gè)指令可以隱藏未編譯的 Mustache 標(biāo)簽直到實(shí)例準(zhǔn)備完畢素邪。
  • v-once
    只渲染元素和組件一次外莲。隨后的重新渲染,元素/組件及其所有的子節(jié)點(diǎn)將被視為靜態(tài)內(nèi)容并跳過兔朦。

3.3 事件修飾符

有些指令支持修飾符

  • @click.stop = 'add' 表示阻止事件傳播偷线,冒泡
  • @click.prevent = 'add' 表示阻止默認(rèn)動(dòng)作
  • @click.prevent.stop = 'add' 表示以上兩種意思

常用的修飾符有很多

  • v-on 支持的有 .{ keycode | keyAlias } 即 鍵碼 或 按鍵別名
  • 另外還有 .stop .prevent .capture .self .once .passive .native
  • 快捷鍵相關(guān) .ctrl .alt .shift .meta .exact
  • 鼠標(biāo)相關(guān) .left .right .middle
  • v-bind 支持的 .prop .camel .sync
  • v-model 支持的 .lazy .number .trim

3.4 .sync飾符

Vue的幾個(gè)規(guī)則

  • 組件不能修改 props 外部數(shù)據(jù)
  • $emit 可以觸發(fā)事件,并傳參
  • event 可以獲取$emit的參數(shù)
    在有些情況下沽甥,我們可能需要對(duì)一個(gè) prop 進(jìn)行“雙向綁定”声邦。但是真正的雙向綁定會(huì)帶來維護(hù)上的問題,因?yàn)樽咏M件可以變更父組件摆舟,且在父組件和子組件都沒有明顯的變更來源會(huì)顯得混亂翔忽。因此 Vue 推薦以 update:myPropName 的模式觸發(fā)事件(發(fā)布訂閱模式)取而代之英融。
    看一個(gè)場(chǎng)景,子組件要使用父組件傳遞的參數(shù)加以修改歇式。
    這里是子組件驶悟,點(diǎn)擊執(zhí)行自定義事件 'update:money.' 執(zhí)行內(nèi)容 為 'money - 100'
<template>
  <div class="child">
    {{money}}
    <button @click="$emit('update:money',money - 100)">
      <span>花錢</span>>
    </button>
  </div>
</template>
<script>
export default {
  props:['money']
}
</script> 

這里是父組件 ,傳給子組件 :money='total' props 數(shù)據(jù).父元素綁定'update:money'事件,子組件執(zhí)行時(shí)便觸發(fā)事件材失,執(zhí)行 total = $event痕鳍。$event表示子組件調(diào)用的參數(shù)。
當(dāng)子組件修改父組件數(shù)據(jù)時(shí)龙巨,必須這樣寫笼呆,不可以直接修改。

<template>
  <div id="app">
    App.vue 我現(xiàn)在有 {{total}}
    <hr/>
    <Child :money="total" v-on:update:money="total = $event"/>
  </div>
</template>
<script>
import Child from './components/Child.vue'
export default {
  name: 'App',
  data(){
    return {
      total:10000
    }
  },
  methods:{
    add(){
      this.n++;
    }
  },
  components:{
    Child:Child
  }
}
</script>

.sync 修飾符時(shí)

<Child :money.sync="total"/>  
<!-- 等價(jià)于 -->
<Child :money="total" v-on:update:money="total = $event"/>
<template>
    <div class="details">
        <myComponent :show.sync='valueChild' style="padding: 30px 20px 30px 5px;border:1px solid #ddd;margin-bottom: 10px;"></myComponent>
        <button @click="changeValue">toggle</button>
    </div>
</template>
<script>
import Vue from 'vue'
Vue.component('myComponent', {
      template: `<div v-if="show">
                    <p>默認(rèn)初始值是{{show}},所以是顯示的</p>
                    <button @click.stop="closeDiv">關(guān)閉</button>
                 </div>`,
      props:['show'],
      methods: {
        closeDiv() {
          this.$emit('update:show', false); //觸發(fā) input 事件秸弛,并傳入新值
        }
      }
})
export default{
    data(){
        return{
            valueChild:true,
        }
    },
    methods:{
        changeValue(){
            this.valueChild = !this.valueChild
        }
    }
}
</script>

這是博客中的示例代碼铭若。
步驟

  • .sync修飾符監(jiān)聽子組件的 prop --show標(biāo)志位。
  • 子組件的模板在頁面中添加了一個(gè)由show控制是否顯示的一個(gè)段落和一個(gè)按鈕的div递览,show初始值為true叼屠,代表顯示這個(gè)div。
  • 當(dāng)點(diǎn)擊關(guān)閉按鈕調(diào)用 closeDiv() 觸發(fā)事件绞铃,使show變?yōu)閒alse镜雨,而 updata:show 將數(shù)據(jù)更新,使得 div 不顯示儿捧。
  • 再去點(diǎn)擊父組件 toggle 按鈕將標(biāo)志位取反為true荚坞,讓這塊div重新顯示。
<myComponent :show.sync='valueChild' />
<!-- 等價(jià)于 -->
<myComponent :show='valueChild' v-on:'update:show'="valueChild=$event"/>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末菲盾,一起剝皮案震驚了整個(gè)濱河市颓影,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌亿汞,老刑警劉巖瞭空,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件揪阿,死亡現(xiàn)場(chǎng)離奇詭異疗我,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)南捂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門吴裤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人溺健,你說我怎么就攤上這事麦牺。” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵剖膳,是天一觀的道長(zhǎng)魏颓。 經(jīng)常有香客問我,道長(zhǎng)吱晒,這世上最難降的妖魔是什么甸饱? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮仑濒,結(jié)果婚禮上叹话,老公的妹妹穿的比我還像新娘。我一直安慰自己墩瞳,他們只是感情好驼壶,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著喉酌,像睡著了一般热凹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瞭吃,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天碌嘀,我揣著相機(jī)與錄音,去河邊找鬼歪架。 笑死股冗,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的和蚪。 我是一名探鬼主播止状,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼攒霹!你這毒婦竟也來了怯疤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤催束,失蹤者是張志新(化名)和其女友劉穎集峦,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體抠刺,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡塔淤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了速妖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片高蜂。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖罕容,靈堂內(nèi)的尸體忽然破棺而出备恤,到底是詐尸還是另有隱情稿饰,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布露泊,位于F島的核電站喉镰,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏惭笑。R本人自食惡果不足惜梧喷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望脖咐。 院中可真熱鬧铺敌,春花似錦、人聲如沸屁擅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽派歌。三九已至弯囊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間胶果,已是汗流浹背匾嘱。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留早抠,地道東北人霎烙。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蕊连,于是被迫代替她去往敵國和親悬垃。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

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