vuejs-指令詳解

来源:http://www.cnblogs.com/moqiutao/archive/2017/02/07/6366463.html
-Advertisement-
Play Games

v-if v-if指令可以完全根據表達式的值在DOM中生成或移除一個元素。如果v-if表達式賦值為false,那麼對應的元素就會從DOM中移除;否則,對應元素的一個克隆將被重新插入DOM中,代碼如下: 由於v-if是一個指令,需要將它添加到一個元素上。但是如果想要切換多個元素,則可以把<templa ...


v-if

v-if指令可以完全根據表達式的值在DOM中生成或移除一個元素。如果v-if表達式賦值為false,那麼對應的元素就會從DOM中移除;否則,對應元素的一個克隆將被重新插入DOM中,代碼如下:

<div id="example-2">
    <p v-if="greeting">Hello!</p>
</div>

<script type="text/javascript">
    var exampleVM2 = new Vue({
        el: '#example-2',
        data: {
            greeting: true
        }
    })
</script>

由於v-if是一個指令,需要將它添加到一個元素上。但是如果想要切換多個元素,則可以把<template>元素當做包裝元素,併在其上使用v-if,最終的渲染結果不會包含它。代碼如下:

<div id="example-2">
    <template v-if="greeting">
        <h1>Title</h1>
        <p>Paragraph 1</p>
        <p>Paragraph 1</p>
    </template>
</div>

<script type="text/javascript">
    var exampleVM2 = new Vue({
        el: '#example-2',
        data: {
            greeting: true
        }
    })
</script>

v-show

v-show指令是根據表達式的值來顯示或者隱藏HTML元素。當v-show賦值為false時,元素被隱藏。查看DOM時,會發現元素上多了一個內聯樣式style="display:none"
如圖所示:

註:v-show不支持<template>語法
一般來說,v-if有更高的切換消耗,而v-show有更高的初始渲染消耗。因此,如果需要頻繁的切換,則使用v-show較好;如果在運行時條件不大可能改變,則使用v-if較好。

v-else

v-else就是JavaScript中的else的意思,它必須跟著v-if或者v-show使用。如下代碼:

<div id="example">
    <P v-if="ok">我是對的</P>
    <p v-else="ok">我是錯的</p>
</div>
<script type="text/javascript">
    var exampleVM2 = new Vue({
        el: '#example',
        data: {
            ok: false
        }
    })
</script>

將v-show用在組件上時,因為指令的優先順序v-else會出現問題,所以不要這樣做。我們可用用另一個v-show替換v-else。

v-model

v-model指令用來在input、select、text、checkbox、radio等表單控制項元素上創建雙向數據綁定的。根據控制項類型v-model自動選取正確的方法更新元素。代碼如下:

<div id="example">
    <form>
                    姓名:
        <input type="text" v-model="data.name" placeholder="姓名"/>
        <br />
        性別:
        <input type="radio" id="one" value="One" v-model="data.sex"/>
        <label for="man"></label>
        <input type="radio" id="two" value="Two" v-model="data.sex"/>
        <label for="male"></label>
        <br />
        <input type="checkbox" id="jack" value="book" v-model="data.interest"/>
        <label for="jack">閱讀</label>
        <input type="checkbox" id="john" value="swim" v-model="data.interest"/>
        <label for="john">游泳</label>
        <input type="checkbox" id="move" value="game" v-model="data.interest"/>
        <label for="move">游戲</label>
        <input type="checkbox" id="mike" value="song" v-model="data.interest"/>
        <label for="mike">唱歌</label>
        <br />
                   身份:
        <select v-model="data.identity">
            <option value="teacher" selected>教師</option>
            <option value="doctor">醫生</option>
            <option value="lawyer">律師</option>
        </select>          
    </form>
</div>
<script type="text/javascript">
    new Vue({
        el: '#example',
        data: {
            data:{
                name:'',
               sex:'',
               interest:[],
               identity:''
            }
        }
    })
</script>

除了以上用法,在v-model指令後面還可以添加多個參數(number、lazy、debounce)。

1.number

如果想要用戶的輸入自動轉換為Number類型(如果原值的轉換結果為NAN,則返回原值),則可以添加一個number特性。

2.lazy

在預設情況下,v-model在input事件中同步輸入框的值與數據,我們可以添加一個lazy特性,從而將數據改到在change事件中發生。代碼如下:

<div id="example">
    <input v-model="msg" lazy style="width:500px;"/><br/>
    {{msg}}
</div>
<script type="text/javascript">
    new Vue({
        el: '#example',
        data: {
            msg:'內容是在change事件後才改變的~'
        },
        watch:{
            
        }
    })
</script>

3.debounce

設置一個最小的延時,在每次敲擊之後延時同步輸入框的值與數據。如果每次更新都要進行高耗操作(例如,在input中輸入內容時要隨時發送ajax請求),那麼它較為有用。

<input v-model="msg" debounce="5000"/>

v-repeat

v-repeat(已經廢除)指令基於源數據重覆渲染元素。可以使用$index來呈現相對應的數組索引。不細講。

數組變動檢測

Vue.js 包裝了被觀察數組的變異方法,故它們能觸發視圖更新。被包裝的方法有:push(), pop(), shift(), unshift(), splice(), sort(), reverse()

example1.items.push({ message: 'Baz' });
example1.items = example1.items.filter(function (item) {
  return item.message.match(/Foo/);
}); 

vue.js還增加了兩個方法來觀測變化:$set、$remove。

我們應該儘量避免直接設置數據綁定的數組元素,因為這些變化不會被vue.js檢測到,因而也不會更新視圖渲染。可以使用$set方法:

demo.items.$set(0,{childMsg:'Changed!'})

$remove是$splice的語法糖,用於從目標數組中查找並刪除元素:

demo.items.$remove(0);

註:ECMAScript5無法檢測到新屬性添加到一個對象上或者在對象上刪除。要處理這種情況,Vue.js增加了三種方法:$add(key,value)、$set(key,value)、$delete(key,value),這些方法可以用來添加和刪除屬性,同時觸發視圖更新。

內置過濾器

1.filterBy(0.12版本)

 實現如圖所示:

<div id="example">
    <input v-model="searchText"/>
    <ul>
        <li v-for="user in users | filterBy searchText in 'name' ">{{user.name}}</li>
    </ul>
</div>
<script type="text/javascript">
    new Vue({
        el: '#example',
        data: {
            users:[
                {
                    name:'快車',
                    tag:'1'
                },
                {
                    name:'計程車',
                    tag:'2'
                },
                {
                    name:'順風車',
                    tag:'3'
                },
                {
                    name:'專車',
                    tag:'4'
                }
            ]
        }
    })
</script>

在輸入框中輸入'專車',得到如圖所示的結果:

2.orderBy(0.12版本)

實現降序排列,例:

<div id="example">
    <ul>
        <li v-for="user in users | orderBy field reverse">{{user.name}}</li>
    </ul>
</div>
<script type="text/javascript">
    new Vue({
        el: '#example',
        data: {
            field:'tag',
            reverse:-1,
            users:[
                {
                    name:'計程車',
                    tag:'2'
                },
                {
                    name:'快車',
                    tag:'1'
                },
                {
                    name:'順風車',
                    tag:'3'
                },
                {
                    name:'專車',
                    tag:'4'
                }
            ]
        }
    })
</script>

結果:

  • 專車
  • 順風車
  • 計程車
  • 快車

v-for

使用$index來獲得相應的數組索引。

<div id="example">
    <ul>
        <li v-for="item of items" class="item-{{$index}}">
            {{$index}} - {{parentMessage}} - {{item.msg}}
        </li>
    </ul>
</div>
<script type="text/javascript">
    new Vue({
        el: '#example',
        data: {
            parentMessage:'滴滴',
            items:[
                {msg:'順風車'},
                {msg:'專車'}
            ]
        }
    })
</script>

結果:

  • 0 - 滴滴 - 順風車
  • 1 - 滴滴 - 專車

註:vuejs1.0.17及以後低版本支持of分隔符,更接近JavaScript遍歷器語法。

有時我們可能想重覆一個包含多個DOM元素的塊,可以使用<template>,如:

<ul>
  <template v-for="item in items">
    <li>{{ item.msg }}</li>
    <li class="divider"></li>
  </template>
</ul> 

v-for也支持整數

代碼如下:

<div>
  <span v-for="n in 10">{{ n }} </span>
</div>

或者

<div>
  <span v-for="n in 10">{{ $index }} </span>
</div>

v-text

v-text指令可以更新元素的textContent.

<span v-text="msg"></span><br/>
<span>{{msg}}</span>

得到的結果一樣。

v-html

v-html指令更新元素的innerHTML。

<div id="example">
    <p v-html="html"></p>
    <p>{{{html}}}</p>
</div>
<script type="text/javascript">
    new Vue({
        el: '#example',
        data: {
           html:'<p>效果一樣</p>'
        }
    })
</script>

註:不建議在網站上直接動態渲染任意HTML片段,很容易導致XSS攻擊。

v-bind

v-bind指令用於響應更新HTML特性,將一個或者多個attribute,或者一個組件prop動態綁定到表達式。v-bind可以簡寫為:

<!-- 完整語法 -->
<a v-bind:href="url"></a>

<!-- 縮寫 -->
<a :href="url"></a>

<!-- 完整語法 -->
<button v-bind:disabled="someDynamicCondition">Button</button>

<!-- 縮寫 -->
<button :disabled="someDynamicCondition">Button</button>

在綁定class或者style時,支持其他類型的值,如數組或對象。如:

<div id="example">
    <div :class="[classA,{classB:isB,classC:isC}]"></div>
</div>
<script type="text/javascript">
    new Vue({
        el: '#example',
        data: {
          classA:'A',
          isB:false,
          isC:true
        }
    })
</script>

結果如圖:

 

如果沒有參數時,可以綁定到一個對象。註意,此時class和style綁定不支持數組和對象(對象key會轉換為小寫)。代碼如下:

<div id="example">
    <div v-bind="{id:someProp,'OTHERATTR':otherProp}"></div>
</div>
<script type="text/javascript">
    new Vue({
        el: '#example',
        data: {
          someProp:'idName',
          otherProp:'prop'
        }
    })
</script>

結果如圖:

在綁定prop時,prop必須在子組件中聲明。可以用修飾符指定不同的綁定類型。修飾符為:

.sync——雙向綁定,只能用於prop綁定。

.once——單次綁定,只能用於prop綁定。

.camel——將綁定的特性名字轉換回駝峰命名。只能用於普通HTML特性的綁定,通常用於綁定用駝峰命名的SVG特性,比如viewBox。

v-on

v-on指令用於綁定事件監聽器。事件類型由參數指定。

如果訪問原始DOM事件,可以使用$event傳入方法。

<button v-on:click="doThis('hello',$event)"></button>
<!--縮寫-->
<button @click="doThis('hello',$event)"></button>

完整例子:

<div id="example">
  <button v-on:click="greet">Greet</button>
</div>

var vm = new Vue({
  el: '#example',
  data: {
    name: 'Vue.js'
  },
  // 在 methods 對象中定義方法
  methods: {
    greet: function (event) {
      // 方法內 this 指向 vm
      alert('Hello ' + this.name + '!')
      // event 是原生 DOM 事件
      alert(event.target.tagName)
    }
  }
})

// 也可以在 JavaScript 代碼中調用方法
vm.greet(); // -> 'Hello Vue.js!'

###事件修飾符

<!-- 阻止單擊事件冒泡 -->
<a v-on:click.stop="doThis"></a>

<!-- 提交事件不再重載頁面 -->
<form v-on:submit.prevent="onSubmit"></form>

<!-- 修飾符可以串聯 -->
<a v-on:click.stop.prevent="doThat">

<!-- 只有修飾符 -->
<form v-on:submit.prevent></form>

### 按鍵修飾符

<!-- 只有在 keyCode 是 13 時調用 vm.submit() -->
<input v-on:keyup.13="submit">
<!-- 同上 -->
<input v-on:keyup.enter="submit">
<!-- 縮寫語法 -->
<input @keyup.enter="submit">

全部的按鍵別名:enter,tab,delete,esc,space,up,down,left,right

v-ref

在父組件上註冊一個子組件的索引,便於直接訪問。不需要表達式,必須提供參數id。可以通過父組件的$refs對象訪問子組件。

v-el

為DOM元素註冊一個索引,方便通過所屬實例的$els訪問這個元素。可以用v-el:some-el設置this.$els.someEl。

<span v-el:msg>hello</span>
<span v-el:other-msg>world</span>

通過this.$els獲取相應的DOM元素:

this.$els.msg.textContent //'hello'

this.$els.otherMsg.textContent //'world'

在新的vuejs中,簡單起見, v-el 和 v-ref 合併為一個 ref 屬性了,可以在組件實例中通過 $refs 來調用。

v-pre

跳過這個元素和它的子元素的編譯過程。可以用來顯示原始 Mustache 標簽。跳過大量沒有指令的節點會加快編譯。

<span v-pre>{{ this will not be compiled }}</span>

v-cloak

這個指令保持在元素上直到關聯實例結束編譯。和 CSS 規則如 [v-cloak] { display: none } 一起用時,這個指令可以隱藏未編譯的 Mustache 標簽直到實例準備完畢。

css代碼:

[v-cloak] {
  display: none;
}

html:

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

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 原生JavaScript實現AJAX、JSONP 相信大多數前端開發者在需要與後端進行數據交互時,為了方便快捷,都會選擇JQuery中封裝的AJAX方法,但是有些時候,我們只需要JQuery的AJAX請求方法,而其他的功能用到的很少,這顯然是沒必要的。 其實,原生JavaScript實現AJAX並不 ...
  • 職責鏈模式 使多個對象都有機會處理請求,從而避免請求的發送者和接收者之間的耦合關係,將這些對象連成一條鏈,並沿著這條鏈傳遞該請求,直到有一個對象處理它為止。 書里的訂單的例子 假設我們負責一個售賣手機的電商網站,經過分別交納500元定金和200元定金的兩輪預定(訂單已在此時生成),現在已經到了正式購 ...
  • 一、js表達式 定義:表達式是指能計算出值得任何可用程式單元。 ——wiki 表達式是js一種短語,可使js解釋器用來產生一個值。 ——js《權威指南》 1.原始表達式。 常量/直接量: 3.14/ "test" 等 關鍵字: null,this,true,false 等 變數: i,k,j 等 復 ...
  • 中間件express.static 我們使用express初始化一個目錄的時候,會在app.js中看到一大推的app.use。 其中一個主要的中間件是 express.static (4.0版本依舊保留的中間件) 通過 express.static 可以幫助我們 托管 靜態文件,js,css,img ...
  • 由OpenDigg 出品的前端開源項目周報第七期來啦。我們的前端開源周報集合了OpenDigg一周來新收錄的優質的前端開源項目,方便前端開發人員便捷的找到自己需要的項目工具等。lottie-react-native 實時渲染After Effects動畫 react-navigation 學習一次隨 ...
  • 寫在前面的話 過去一年自己接觸了不少手機前端開發,得益於現在手機性能的提升和4G普及,感覺使用混合技術開發手機App已經可以滿足越來越多的應用場景了。新年伊始,對自己2016年所學知識做一個階段性總結,記錄一個自製的“小而萌”Hybrid App開發歷程,共勉! 〖擴展閱讀〗 企業移動應用開發 混合 ...
  • 每個Nodejs項目的根目錄下麵,一般都會有一個package.json文件。該文件可以由 生成,定義了項目所需要的各種模塊,以及項目的配置信息(比如名稱、版本、許可證等元數據)。 package.json文件內部就是一個JSON對象,該對象的每一個成員就是當前項目的一項設置。 基本欄位 1. na ...
  • 一、relative對absolute的限製作用 1、限制left/top/right/bottom定位。absolute預設是在也沒的左上角,當父類設定為relative,absolute就被限制在父類的區域內,設定top/left/right/bottom時,起始點為父類的左上角 2、限制z-i ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...