Vue.js 的核心是一個允許採用簡潔的模板語法來聲明式地將數據渲染進 DOM 的系統; 指令帶有首碼 v-,以表示它們是 Vue 提供的特殊特性; v-for 指令可以綁定數組的數據來渲染一個項目列表; 為了讓用戶和你的應用進行交互,我們可以用 v-on 指令添加一個事件監聽器,通過它調用在 Vu ...
Vue.js 的核心是一個允許採用簡潔的模板語法來聲明式地將數據渲染進 DOM 的系統;
指令帶有首碼 v-,以表示它們是 Vue 提供的特殊特性;
v-for 指令可以綁定數組的數據來渲染一個項目列表;
為了讓用戶和你的應用進行交互,我們可以用 v-on 指令添加一個事件監聽器,通過它調用在 Vue 實例中定義的方法;
Vue 還提供了 v-model 指令,它能輕鬆實現表單輸入和應用狀態之間的雙向綁定。
可以使用 v-bind 指令將待辦項傳到迴圈輸出的每個組件中;
一個 Vue 應用由一個通過 new Vue 創建的根 Vue 實例,以及可選的嵌套的、可復用的組件樹組成。
除了數據屬性,Vue 實例還暴露了一些有用的實例屬性與方法。它們都有首碼 $,以便與用戶定義的屬性區分開來。
一般來說,v-if 有更高的切換開銷,而 v-show 有更高的初始渲染開銷。因此,如果需要非常頻繁地切換,則使用 v-show 較好;如果在運行時條件很少改變,則使用 v-if 較好。
當 v-if 與 v-for 一起使用時,v-for 具有比 v-if 更高的優先順序。
<div v-for="item in items" :key="item.id">
<!-- 內容 -->
</div>
建議儘可能在使用 v-for 時提供 key,除非遍歷輸出的 DOM 內容非常簡單,或者是刻意依賴預設行為以獲取性能上的提升。
可以用 v-on 指令監聽 DOM 事件,併在觸發時運行一些 JavaScript 代碼。
示例:
<div id="example-1">
<button v-on:click="counter += 1">Add 1</button>
<p>The button above has been clicked {{ counter }} times.</p>
</div>
var example1 = new Vue({
el: '#example-1',
data: {
counter: 0
}
})
v-on:click.prevent.self
會阻止所有的點擊,而 v-on:click.self.prevent
只會阻止對元素自身的點擊。
<!-- 點擊事件將只會觸發一次 -->
<a v-on:click.once="doThis"></a>
<div v-on:scroll.passive="onScroll">...</div> |
這個 .passive 修飾符尤其能夠提升移動端的性能。
不要把 .passive 和 .prevent 一起使用,因為 .prevent 將會被忽略,同時瀏覽器可能會向你展示一個警告。請記住,.passive 會告訴瀏覽器你_不_想阻止事件的預設行為。
<!-- 只有在 `keyCode` 是 13 時調用 `vm.submit()` -->
<input v-on:keyup.13="submit">
.exact 修飾符允許你控制由精確的系統修飾符組合觸發的事件。
<!-- 即使 Alt 或 Shift 被一同按下時也會觸發 --> |
數據顯示綁定:
<input v-model="message" placeholder="edit me">
<p>Message is: {{ message }}</p>
多行文本:
<span>Multiline message is:</span> |
(js代碼 省略)
單個覆選框,綁定到布爾值:
<input type="checkbox" id="checkbox" v-model="checked"> |
多個覆選框,綁定到同一個數組:
<div id='example-3'> |
new Vue({ |
單選按鈕:
<div id="example-4"> |
new Vue({ |
選擇框:
單選時:
<div id="example-5"> |
new Vue({ |
<select> 標簽的 multiple 屬性規定可同時選擇多個選項。
多選時 (綁定到一個數組):
<div id="example-6"> |
new Vue({ |
用 v-for 渲染的動態選項:
<select v-model="selected"> |
new Vue({ |
對於單選按鈕,覆選框及選擇框的選項,v-model
綁定的值通常是靜態字元串 (對於覆選框也可以是布爾值):
如果想自動將用戶的輸入值轉為數值類型,可以給 v-model 添加 number 修飾符:
<input v-model.number="age" type="number"> |
這通常很有用,因為即使在 type="number" 時,HTML 輸入元素的值也總會返回字元串。
如果要自動過濾用戶輸入的首尾空白字元,可以給 v-model 添加 trim 修飾符:
<input v-model.trim="msg"> |
size.trim().toLowerCase() trim(): 它的作用是:去除字元串前後的空格.
toLowerCase 方法 (JavaScript): 將字元串中的所有字母字元轉換為小寫形式。
自 2.3.0 起,非同步組件的工廠函數也可以返回一個如下的對象:
const AsyncComp = () => ({ |
註意,當一個非同步組件被作為 vue-router 的路由組件使用時,這些高級選項都是無效的,因為在路由切換前就會提前載入所需要的非同步組件。另外,如果你要在路由組件中使用上述寫法,需要使用 vue-router 2.4.0 以上的版本。
在 HTML 模板中,請使用 kebab-case:
<!-- 在 HTML 模板中始終使用 kebab-case
--> |
組件在它的模板內可以遞歸地調用自己。不過,只有當它有 name 選項時才可以這麼做:
name: 'unique-name-of-my-component' |
當你利用 Vue.component 全局註冊了一個組件,全局的 ID 會被自動設置為組件的 name。
Vue.component('unique-name-of-my-component', { |
如果稍有不慎,遞歸組件可能導致死迴圈:
name: 'stack-overflow', |
上面組件會導致一個“max stack size exceeded”錯誤,所以要確保遞歸調用有終止條件 (比如遞歸調用時使用 v-if 並最終解析為 false)。
假設你正在構建一個文件目錄樹,像在 Finder
或資源管理器中。你可能有一個 tree-folder
組件, 以及一個 tree-folder-contents
組件
另一種定義模板的方式是在 JavaScript 標簽里使用 text/x-template 類型,並且指定一個 id。例如:
<script type="text/x-template" id="hello-world-template"> |
Vue.component('hello-world', { |
這在有很多大模板的演示應用或者特別小的應用中可能有用,其它場合應該避免使用,因為這將模板和組件的其它定義分離了。
我也是初學vue,新人總結不全滿,還望諒解~