基本指令

v-cloak

v-cloak 不需要表達式颂砸,它會在Vue實例結束編譯時從綁定的HTML元素上移除渊胸,經常和CSS的display:none配合使用。
v-cloak 是一個解決初始化慢導致頁面閃動的最佳實踐奄容。

示例代碼
<template>
    <div v-cloak>{{msg}}</div>
</template>
<script>
export default {
  name: "Directive",
  data() {
    return {
      msg: "v-cloak"
    };
  }
};
</script>
<style scoped>
[v-cloak] {
  display: none;
}
</style>

v-once

v-once 也是一個不需要表達式的指令踊东,作用是定義它的元素或組件只渲染一次,包括元素或者組件的所有子界面胞四。首次渲染后恬汁,不在隨數據的變化重新渲染,將被視為靜態(tài)內容辜伟。

示例代碼
<template>
    <div v-once>{{msg}}</div>
</template>
<script>
export default {
  name: "Directive",
  data() {
    return {
      msg: "v-once"
    };
  }
};
</script>  

v-if蕊连、v-else-if、v-else

和JavaScript的條件語句if游昼、else甘苍、else-if類似,Vue的條件指令可以根據表達式的值在DOM中渲染或銷毀元素或者組件烘豌。v-else-if要緊跟v-if,v-else要緊跟v-else-ifv-if,表達式值為true時载庭,當前元素或組件及所有子節(jié)點將被渲染,為false時被移除廊佩。

示例代碼
<template>
    <p v-if="status===1">Status=1</p>
    <p v-else-if="status===2">Status=2</p>
    <p v-else>Status={{status}}</p>
</template>

<script>
export default {
  name: "IfComponent",
  data() {
    return {
      status: 1
    };
  }
};
</script>

如果一次判斷的是多個元素囚聚,可以在vue內置的<template>元素上使用條件指令,最終渲染的結果不會包含該元素标锄。

示例代碼
<template>
<div>
    <template v-if="status===1">
      <p>??</p>
      <p>??</p>
      <p>??</p>
    </template>
</div>
</template>

<script>
export default {
  name: "IfComponent",
  data() {
    return {
      status: 1
    };
  }
};
</script>

vue在渲染元素是顽铸,出于效率考慮,會盡可能的復用已有的元素而非重新渲染料皇。

代碼示例
<template>
<div>
  <template v-if="type==='name'">
     <label>用戶名: </label>
     <input placeholder="請輸入用戶名">
</template>

<template v-else>
<label>郵箱: </label>
<input placeholder="請輸入郵箱">
</template>

<button @click="handleChangeInputType">切換輸入類型</button>
</div>
</template>

<script>
export default {
  name: "IfComponent",
  data() {
    return {
      type: "name"
    };
  },
  methods: {
    handleChangeInputType: function() {
      this.type = this.type === "name" ? "mail" : "name";
    }
  }
};
</script>
結果
圖一
圖二

我們可以使用vue提供的key屬性來決定是否要復用元素谓松,key值必須是唯一的。有了key只有践剂,元素就不會重用了鬼譬。

代碼示例
<template>
<div>
  <template v-if="type==='name'" >
     <label>用戶名: </label>
     <input placeholder="請輸入用戶名" key="name-input">
</template>

<template v-else>
<label>郵箱: </label>
<input placeholder="請輸入郵箱" key="email-input">
</template>

<button @click="handleChangeInputType">切換輸入類型</button>
</div>
</template>

<script>
export default {
  name: "IfComponent",
  data() {
    return {
      type: "name"
    };
  },
  methods: {
    handleChangeInputType: function() {
      this.type = this.type === "name" ? "mail" : "name";
    }
  }
};
</script>
結果
圖三
圖四

v-show

v-show的用法與v-if基本一致,只不過v-show是改變元素的CSS屬性display逊脯。當v-show表達式為false時优质,元素會被隱藏。為true時顯示。

示例代碼
<template>
    <div>
      <h3 v-show="isShow">{{msg}}</h3>
    </div>
</template>

<script>
export default {
  name: "Show",
  data() {
    return {
      isShow: falses,
      msg: "v-show"
    };
  }
};
</script>
結果
圖五

v-if和v-show應用場景

v-if 更適合條件不經常改變的場景巩螃,應為它切換開銷相對較大演怎,而v-show 適用于頻繁切換條件。

列表渲染指令 v-for

當需要將一個數組遍歷或者枚舉一個對象循環(huán)顯示時避乏,就會用到列表渲染指令v-for颤枪。它的表達式需要結合in或者of來使用,類似item in items或者 item of items的形式淑际。

代碼示例
<template>
    <div>
        <ul>
           <li v-for="book in books" :key="book.name">{{book.name}}</li> 
        </ul>
    </div>
</template>

<script>
export default {
  name: "For",
  data() {
    return {
      books: [
        { name: "《Vue》" },
        { name: "《Angular》" },
        { name: "《React》" }
      ]
    };
  }
};
</script>
結果
圖六

v-for 表達式支持一個可選參數作為當前的索引。

示例代碼
<template>
    <div>
        <ul>
           <li v-for="(book,index) in books" :key="book.name">{{index}}扇住、{{book.name}}</li> 
        </ul>
    </div>
</template>

<script>
export default {
  name: "For",
  data() {
    return {
      books: [
        { name: "《Vue》" },
        { name: "《Angular》" },
        { name: "《React》" }
      ]
    };
  }
};
</script>
結果
圖七

v-if一樣春缕,v-for也可以用在內置標簽<template>上,將多個元素進行渲染艘蹋。

v-for對象遍歷

v-for 遍歷對象屬性時锄贼,有兩個可選參數,分別為鍵名和索引女阀。

示例代碼
<template>
    <div>
        <ul>
            <li v-for="(value,key,index) in user" :key="key">{{index}}-{{key}}-{{value}}</li>
        </ul>
    </div>
</template>

<script>
export default {
  name: "For",
  data() {
    return {
      user: {
        name: "Nick",
        age: 18,
        sex: "男"
      }
    };
  }
};
</script>
結果
圖八

v-for 還可以迭代整數宅荤。

示例代碼
<template>
    <div>
        <ul>
            <li v-for="n in 3">{{n}}</li>
        </ul>
    </div>
</template>

<script>
export default {
  name: "For",
  data() {
    return {};
  }
};
</script>
結果
圖九

數組更新

vue的核心是數據與視圖的雙向綁定,當我們修改數組時浸策,vue會檢測到數據變化冯键,所以用v-for渲染的視圖也會立即更新。vue包含了一組觀察數組變異的方法庸汗,使用它們改變數組也會觸發(fā)視圖的更新惫确。

  • push( ) 向數組的末尾添加一個或更多元素
  • pop( ) 刪除并返回數組的最后一個元素
  • shift( ) 刪除并返回數組的第一個元素
  • unshift( ) 向數組的開頭添加一個或更多元素,并返回新的長度蚯舱。
  • splice( ) 刪除元素改化,并向數組添加新元素。
  • sort( ) 對數組的元素進行排序
  • reverse( ) 顛倒數組中元素的順序枉昏。

但有一些方法不會改變原數組陈肛,它們都返回的是一個新數組,我們可以用新數組來替換原數組兄裂。

  • filter( ) 過濾不符合條件的元素句旱,返回結果。
  • concat( ) 連接兩個或更多的數組晰奖,并返回結果
  • slice( ) 從某個已有的數組返回選定的元素
注意

以下變動數組中前翎,vue是不能檢測到的,也不會觸發(fā)視圖更新畅涂。

  • 通過索引直接設置項港华。 例如 books[2]={name:"Python"}
  • 修改數組長度,例如 books.length=2
解決辦法

解決第一個問題可以用兩種方法實現(xiàn)同樣的效果午衰,第一種是使用vue內置的set方法:

Vue.set(this.books,2,{name:"《Python》"});

如果是在webpack中使用組件化的方式立宜,默認是沒有導入vue的冒萄,這是可以使用 $set:

this.$set(this.books, 2, { name: "《Python》" });

另一種方法:
通過數組的splice函數實現(xiàn)

this.books.splice(2, 1, { name: "《Python》" });

第二個問題也可以直接使用splice函數解決:

this.books.splice(2);

過濾和排序

當你不想改變原數組,想通過一個數組的副本來做過濾或排序的顯示時橙数,可以使用計算屬性來返回過濾或排序后的數組尊流。

示例代碼
<template>
    <div>
        <ul>
            <template v-for="(book,index) of filiterBooks" class="line">
            <li>技術: {{book.name}}  <p>作者: {{book.author}}</p></li>
            </template>
        </ul>
    </div>
</template>

<script>
export default {
  name: "Sort",
  data() {
    return {
      books: [
        {
          name: "Vue",
          author: "Vue"
        },
        {
          name: "Angular",
          author: "Google"
        },
        {
          name: "React",
          author: "Facebook"
        }
      ]
    };
  },
  computed: {
    filiterBooks: function() {
      return this.books.sort(function(a, b) {
        return a.name.length > b.name.length;
      });
    }
  }
};
</script>

事件和方法

v-on:click 等于 @click
methods中定義了我們需要的方法提供@click調用,需要注意的是灯帮,@click調用的方法名后可以不跟"()"崖技。此時,如果該方法有參數钟哥,默認會將原生事件對象event傳入迎献,可以嘗試修改為@click="handleChangeBook",然后在handleChangeBooks內打印出book參數看看。
這種在HTML元素上監(jiān)聽事件的設計看似將DOM與JavaScript緊耦合腻贰,違背分離的原理吁恍,實則剛好相反。因為通過HTML就可以知道調用的是哪一個方法播演,將邏輯與DOM 解耦冀瓦。便于維護。最重要的是写烤,當ViewModel銷毀時翼闽,所有的時間處理器都會自動刪除,無須自己清理洲炊。
vue提供了一個特殊變量$event,用于訪問原生DOM事件肄程,例如下面的實例可以阻止鏈接打開:

示例代碼
<template>
  <div>
<a :href="url" @click="handleClick('禁止打開',$event)">百度一下</a>
  </div>  
</template>

<script>
export default {
  name: "Methods",
  data() {
    return {
      msg: "methods",
      url: "https://www.baidu.com"
    };
  },
  methods: {
    handleClick: function(message, event) {
      event.preventDefault();
      window.alert(message);
    }
  }
};
</script>
修飾符

@綁定的事件后加上小圓點.,再跟一個后綴來使用修飾符。vue支持一下修飾符:

  • .stop
  • .prevent
  • .capture
  • .self
  • .once

具體用法如下:

<!-- 阻止單擊事件冒泡 -->
<a @click.stop="handleClick"></a>
<!-- 提交事件不再重載頁面 -->
<form @submit.prevent="handle"></form>
<!-- 修飾符可以串聯(lián) -->
<a @click.stop.prevent="handle"></a>
<!-- 只有修飾符 -->
<form @submit.prevent></form>
<!-- 添加事件偵聽器時使用事件捕獲模式 -->
<div @click.capture="handle"></div>
<!-- 只當事件在該元素本身(而不是子元素)觸發(fā)時觸發(fā)回調 -->
<div @click.self="handle"></div>
<!-- 只觸發(fā)一次选浑,組件同樣適用 -->
<div @click.once="handle"></div>

在表單元素上監(jiān)聽鍵盤事件時蓝厌,還可以使用按鍵修飾符,比如按下具體某個鍵時才調用方法:

<!-- 只有在keyCode試13時候調用vm.submit() -->
<input @keyup.13="submit">

也可以自己配置具體按鍵:

Vue.config.keyCodes.f1=112;

全局定義后古徒,就可以使用@keyup.f1
除了具體的某個keyCode外拓提,Vue還提供了一些快捷名稱,以下是全部別名:

  • .enter
  • .tab
  • .delete (捕獲”刪除“和”退格“鍵)
  • .esc
  • .space
  • .up
  • .down
  • .left
  • .right

這些按鍵修飾符也可以組合使用隧膘,或和鼠標一起配合使用:

  • .ctrl
  • .alt
  • .shift
  • .meta (Mac下是Command鍵,Windows下是窗口鍵)
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末代态,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子疹吃,更是在濱河造成了極大的恐慌蹦疑,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件萨驶,死亡現(xiàn)場離奇詭異歉摧,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門叁温,熙熙樓的掌柜王于貴愁眉苦臉地迎上來再悼,“玉大人,你說我怎么就攤上這事膝但〕寰牛” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵跟束,是天一觀的道長莺奸。 經常有香客問我,道長冀宴,這世上最難降的妖魔是什么灭贷? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮花鹅,結果婚禮上,老公的妹妹穿的比我還像新娘枫浙。我一直安慰自己刨肃,他們只是感情好,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布箩帚。 她就那樣靜靜地躺著真友,像睡著了一般。 火紅的嫁衣襯著肌膚如雪紧帕。 梳的紋絲不亂的頭發(fā)上盔然,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天,我揣著相機與錄音是嗜,去河邊找鬼愈案。 笑死,一個胖子當著我的面吹牛鹅搪,可吹牛的內容都是我干的站绪。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼丽柿,長吁一口氣:“原來是場噩夢啊……” “哼恢准!你這毒婦竟也來了?” 一聲冷哼從身側響起甫题,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤馁筐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后坠非,有當地人在樹林里發(fā)現(xiàn)了一具尸體敏沉,經...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了赦抖。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舱卡。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖队萤,靈堂內的尸體忽然破棺而出轮锥,到底是詐尸還是另有隱情,我是刑警寧澤要尔,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布舍杜,位于F島的核電站,受9級特大地震影響赵辕,放射性物質發(fā)生泄漏既绩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一还惠、第九天 我趴在偏房一處隱蔽的房頂上張望饲握。 院中可真熱鬧,春花似錦蚕键、人聲如沸救欧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽笆怠。三九已至,卻和暖如春誊爹,著一層夾襖步出監(jiān)牢的瞬間蹬刷,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工频丘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留办成,地道東北人。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓搂漠,卻偏偏與公主長得像诈火,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子状答,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內容