Vue成神之路之內(nèi)部指令

前言

記錄平時(shí)學(xué)到的知識(shí),標(biāo)題寫的大氣一點(diǎn),也算是給自己一點(diǎn)鼓勵(lì),希望在技術(shù)這條路可以遠(yuǎn)走越遠(yuǎn),路越走越寬~

文中代碼地址

PS:如果對(duì)你有一點(diǎn)幫助,請(qǐng)順手給個(gè)小星星哦,鼓勵(lì)我繼續(xù)寫下去~

引入的文件文件說明

vue.js——開發(fā)版本:包含完整的警告和調(diào)試模式
vue.min.js——生產(chǎn)版本:刪除了警告,進(jìn)行了壓縮

1、內(nèi)部指令

指令 (Directives) 是帶有 v- 前綴的特殊特性。指令特性的值預(yù)期是單個(gè) JavaScript 表達(dá)式 (v-for 是例外情況)。指令的職責(zé)是,當(dāng)表達(dá)式的值改變時(shí),將其產(chǎn)生的連帶影響,響應(yīng)式地作用于 DOM。

1.1 v-if & v-show

v-if

  • v-if:是vue的一個(gè)內(nèi)部指令,必須將它添加到一個(gè)元素上。v-if根據(jù)條件判斷是否加載對(duì)應(yīng)元素的DOM。

  • v-else 指令來表示 v-if 的“else 塊”。v-else 元素必須緊跟在帶 v-if 或者 v-else-if 的元素的后面,否則它將不會(huì)被識(shí)別。

  • v-else-if,顧名思義,充當(dāng)v-if的“else-if塊”,可以連續(xù)使用。類似于v-else,v-else-if 也必須緊跟在帶 v-if 或者 v-else-if 的元素之后。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Hello World!</title>
    <script type="text/javascript" src="../assets/js/vue.js"></script>
</head>
<body>
    <h1>v-if & v-else & v-show</h1>
    <hr>
    <div id="app">
        <div v-if="isLogin == 'A'">v-if</div>
        <div v-else-if="isLogin == 'B'">v-else-if</div>
        <div v-else>v-else</div>
        <div v-show="isLogin">v-show</div>
        <hr>
        <template v-if="isLogin == 'B'">v-if支持template元素</template>
        <template v-show="isLogin == 'B'">v-show不支持template元素</template>>
    </div>

    <script type="text/javascript">
        var app = new Vue({
            el: '#app',
            data: {
                isLogin: 'A'
            },
            components: {
                "test-child": {
                  template:"<h1>我是template</h1>"
                }
            }
        })
    </script>
</body>
</html>

v-show

  • v-show:是另一個(gè)用于根據(jù)條件展示元素的指令。

不同的是帶有 v-show 的元素始終會(huì)被渲染并保留在 DOM 中。v-show 只是簡(jiǎn)單地切換元素的 CSS 屬性 display。

注意,v-show 不支持 <template>元素,也不支持 v-else。

v-if 和v-show的區(qū)別:

  • v-if 是“真正”的條件渲染,因?yàn)樗鼤?huì)確保在切換過程中條件塊內(nèi)的事件監(jiān)聽器和子組件適當(dāng)?shù)乇讳N毀和重建。v-if 也是惰性的:如果在初始渲染時(shí)條件為假,則什么也不做——直到條件第一次變?yōu)檎鏁r(shí),才會(huì)開始渲染條件塊。

  • v-show 就簡(jiǎn)單得多,不管初始條件是什么,元素總是會(huì)被渲染,即元素會(huì)始終渲染并保持在DOM中,并且只是簡(jiǎn)單地基于 CSS 進(jìn)行切換。

  • v-show不支持template元素,作用在template元素上沒有效果,v-if則支持。

一般來說,v-if 有更高的切換開銷(根據(jù)條件對(duì)元素進(jìn)行創(chuàng)建...銷毀...創(chuàng)建...銷毀),而 v-show 有更高的初始渲染開銷(不管條件是否為true,,元素都會(huì)被渲染并保存在DOM中)。因此,如果需要非常頻繁地切換,則使用 v-show 較好;如果在運(yùn)行時(shí)條件很少改變,則使用 v-if 較好。

1.2 v-for指令:解決模板循環(huán)問題

用 v-for 指令根據(jù)一組數(shù)組的選項(xiàng)列表進(jìn)行渲染。v-for 指令需要使用 item in items 形式的特殊語法,items 是源數(shù)據(jù)數(shù)組并且 item 是數(shù)組元素迭代的別名。

需要注意的是,你需要那個(gè)html標(biāo)簽循環(huán),v-for就寫在那個(gè)標(biāo)簽上面。

基本用法:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script type="text/javascript" src="../assets/js/vue.js"></script>
    <title>V-for 案例</title>
</head>
<body>
    <h1>v-for指令用法</h1>
    <hr>
    <div id="app">
       <ul>
           <li v-for="item in items">
                {{item}}
           </li>
       </ul>
    </div>
    <script type="text/javascript">
        var app=new Vue({
            el:'#app',
            data:{
                items:[20,23,18,65,32,19,54,56,41]
            }
        })
    </script>
</body>
</html>

排序:
運(yùn)行上面代碼,可以看到瀏覽器順利的輸出了定義的數(shù)組,但是如果想在輸出之前對(duì)定義的數(shù)組進(jìn)行一些操作,例如:給定義的數(shù)組排個(gè)序,則可以使用Vue的computed:屬性。

var app = new Vue({
    ......
    computed:{
        sortItems:function(){
              return this.items.sort(sortNumber);
        }
    }
})

function sortNumber(a,b){
    return a-b
}

在computed里新聲明了一個(gè)對(duì)象sortItems,如果不重新聲明延用data里面定義的數(shù)組items則會(huì)報(bào)錯(cuò),原因是這樣會(huì)污染原來定義的數(shù)據(jù)源,這是Vue不允許的,所以要重新聲明一個(gè)對(duì)象。

對(duì)象循環(huán)輸出:

先定義個(gè)數(shù)組,數(shù)組里邊是對(duì)象數(shù)據(jù)

students: [
    {name: 'Andy', age: 18},
    {name: 'Tony', age: 17},
    {name: 'Alen', age: 35},
    {name: 'zaishuiyixia', age: 25}
]

在模板中輸出

<ul>
   <li v-for="student in students">
       {{student.name}} - {{student.age}}
   </li>
</ul>

加入索引序號(hào):

//數(shù)組對(duì)象方法排序:
function sortByKey(array,key){
    return array.sort(function(a,b){
      var x=a[key];
      var y=b[key];
      return ((x<y)?-1:((x>y)?1:0));
   });
}

有了數(shù)組的排序方法,在computed中進(jìn)行調(diào)用排序

sortStudent:function(){
     return sortByKey(this.students,'age');
}

完整代碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>v-for</title>
    <script type="text/javascript" src="../assets/js/vue.js"></script>
</head>
<body>
    <h1>v-for實(shí)例</h1>
    <hr>
    <div id="app">
        <ul>
            <li v-for="item in sortItems">
                {{item}}
            </li>
        </ul>
        <hr>
        <ul>
            <li v-for="(student, index) in sortStudent">
                {{index+1}}: {{student.name}}-{{student.age}}
            </li>
        </ul>
    </div>

    <script type="text/javascript">
        var app = new Vue({
            el: '#app',
            data: {
                items:[25,58,98,65,28,98,28,76],
                students: [
                    {name: 'Andy', age: 18},
                    {name: 'Tony', age: 17},
                    {name: 'Alen', age: 35},
                    {name: 'zaishuiyixia', age: 25}
                ]
            },
            computed: {
                sortItems: function() {
                    return this.items.sort(sortNumber)
                },
                sortStudent:function(){
                     return sortByKey(this.students,'age');
                }
            }
        });

        function sortNumber(a, b) {
            return a-b;
        }

        //數(shù)組對(duì)象方法排序:
        function sortByKey(array,key){
            return array.sort(function(a,b){
              var x=a[key];
              var y=b[key];
              return ((x<y)?-1:((x>y)?1:0));
           });
        }
    </script>
</body>
</html>

1.3 v-text & v-html指令

Vue中數(shù)據(jù)綁定的形式是使用“Mustache”語法 (雙大括號(hào)) 的文本插值:

<span>Message: {{ msg }}</span>

使用這種語法是有弊端的,就是當(dāng)速很慢或者javascript出錯(cuò)時(shí),瀏覽器會(huì)先顯示{{xxx}}。Vue提供的v-text,就是解決這個(gè)問題的。

<span v-text="message"></span>
<!-- 和下面的一樣 -->
<span>{{message}}</span>

如果在javascript中寫有html標(biāo)簽,用v-text是輸出不出來的,這時(shí)候我們就需要用v-html標(biāo)簽了。

雙大括號(hào)會(huì)將數(shù)據(jù)解釋為純文本,而非HTML。為了輸出真正的HTML,就需要使用v-html 指令。 需要注意的是:在生產(chǎn)環(huán)境中動(dòng)態(tài)渲染HTML是非常危險(xiǎn)的,因?yàn)槿菀讓?dǎo)致XSS攻擊。所以只能在可信的內(nèi)容上使用v-html,永遠(yuǎn)不要在用戶提交和可操作的網(wǎng)頁上使用。 完整代碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>v-text & v-html實(shí)例</title>
    <script type="text/javascript" src="../assets/js/vue.js"></script>
</head>
<body>
    <h1>v-text & v-html實(shí)例</h1>
    <hr>
    <div id="app">
        <span>{{message}}</span> == <span v-text="message"></span>
        <br>
        <span v-html="html"></span>
    </div>

    <script type="text/javascript">
        var app = new Vue({
            el: '#app',
            data: {
                message: 'hello world!',
                html: '<h2>hello world!</h2>'
            }
        })
    </script>
</body>
</html>

1.4 v-on指令

綁定事件監(jiān)聽器。事件類型由參數(shù)指定。表達(dá)式可以是一個(gè)方法的名字或一個(gè)內(nèi)聯(lián)語句,如果沒有修飾符也可以省略。

用在普通元素上時(shí),只能監(jiān)聽原生 DOM 事件。用在自定義元素組件上時(shí),也可以監(jiān)聽子組件觸發(fā)的自定義事件。

使用綁定事件監(jiān)聽器,編寫一個(gè)加分減分的程序:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>v-on實(shí)例</title>
    <script type="text/javascript" src="../assets/js/vue.js"></script>
</head>
<body>
    <h1>v-on實(shí)例</h1>
    <hr>
    <div id="app">
        本場(chǎng)比賽得分:{{score}}
        <p>
            <button v-on:click="jiafen">加分</button>
            <button v-on:click="jianfen">減分</button>
            <br><br>
            <!-- 綁定鍵盤的enter鍵 -->
            <input type="text" v-on:keyup.enter="onEnter" v-model="score2" >
        </p>
    </div>

    <script type="text/javascript">
        var app = new Vue({
            el: '#app',
            data: {
                score: 0,
                score2: 1
            },
            methods: {
                jiafen: function() {
                    this.score++;
                },
                jianfen: function() {
                    this.score--;
                },
                onEnter: function() {
                    this.score = this.score + parseInt(this.score2)
                }
            }
        })
    </script>
</body>
</html>

v-on 還有一種簡(jiǎn)單的寫法,就是用@代替。

<button @click="jianfen">減分</button>

除了綁定click之外,還可以綁定其它事件,比如鍵盤回車事件v-on:keyup.enter,現(xiàn)在增加一個(gè)輸入框,然后綁定回車事件,回車后把文本框里的值加到我們的count上。 綁定事件寫法:

<input type="text" v-on:keyup.enter="onEnter" v-model="score2">

javascript代碼:

onEnter:function(){
     this.count=this.count+parseInt(this.secondCount);
}

因?yàn)槲谋究虻臄?shù)字會(huì)默認(rèn)轉(zhuǎn)變成字符串,所以我們需要用parseInt()函數(shù)進(jìn)行整數(shù)轉(zhuǎn)換。

1.5 v-model

v-model指令,可簡(jiǎn)單的理解為綁定數(shù)據(jù)源。就是把數(shù)據(jù)綁定在特定的表單元素上,可以很容易的在表單控件或者組件上創(chuàng)建雙向綁定 、 。

使用限制,應(yīng)該用于表單控件或者組件上:

<input>、<select>、<textarea>、components

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>v-model綁定數(shù)據(jù)源實(shí)例</title>
    <script type="text/javascript" src="../assets/js/vue.js"></script>
</head>
<body>
    <h1>v-model綁定數(shù)據(jù)源實(shí)例</h1>
    <hr>
    <div id="app">
        <p>原始文本信息:{{message}}內(nèi)部指令</p>
        <h3>文本框</h3>
        <p>v-model:<input type="text" v-model="message"></p>
        <p>v-model.lazy:<input type="text" v-model.lazy="message"></p>
        <p>v-model.number:<input type="text" v-model.number="message"></p>
        <p>v-model.trim<input type="text" v-model.trim="message"></p>
        <hr>
        <h3>文本域</h3>
        <textarea cols="30" rows="10" v-model="message"></textarea>
        <hr>
        <h3>多選框綁定一個(gè)值</h3>
        <input type="checkbox" id="isTrue" v-model="isTrue">
        <label for="isTrue">{{isTrue}}</label>
        <hr>
        <h3>多選框綁定數(shù)組</h3>
        <p>
            <input type="checkbox" id="alen" value="alen" v-model="names">
            <label for="alen">alen</label>
            <input type="checkbox" id="andy" value="andy" v-model="names">
            <label for="andy">andy</label>
            <input type="checkbox" id="tony" value="tony" v-model="names">
            <label for="tony">tony</label>
            <p>{{names}}</p>
        </p>
        <hr>
        <h3>單選框綁定</h3>
        <p>
            <input type="radio" id="man" value="男" v-model="sex">
            <label for="man">男</label>
            <input type="radio" id="woman" value="女" v-model="sex">
            <label for="woman">女</label>
            <p>你選擇的性別是:{{sex}}</p>
        </p>
    </div>

    <script type="text/javascript">
        var app = new Vue({
            el: '#app',
            data: {
                message: 'hello world!',
                isTrue: true,
                names: [],
                sex: '男'
            },
            methods: {
                
            }
        })
    </script>
</body>
</html>

1.6 v-bind

動(dòng)態(tài)地綁定一個(gè)或多個(gè)屬性。在綁定 class 或 style 特性時(shí),支持其它類型的值,如數(shù)組或?qū)ο蟆?/p>

綁定css樣式,在綁定CSS樣式時(shí),綁定的值必須在vue中的data屬性中進(jìn)行聲明:

1、直接綁定class樣式

<div :class="className">1、綁定classA</div>

2、綁定classA并進(jìn)行判斷,在isClassA為true時(shí)顯示樣式,在isClassA為false時(shí)不顯示樣式。

<div :class="{classA:isClassA}">2、綁定class中的判斷</div>

3、綁定class中的數(shù)組

<div :class="[classA,classB]">3、綁定class中的數(shù)組</div>

4、綁定class中使用三元表達(dá)式判斷

<div :class="isClassA?classA:classB">4、綁定class中的三元表達(dá)式判斷</div>

5、綁定style

<div :style="{color:red,fontSize:font}">5、綁定style</div>

6、用對(duì)象綁定style樣式

<div :style="styleObject">6、用對(duì)象綁定style樣式</div>
......
var app=new Vue({
   el:'#app',
   data:{
       styleObject:{
           fontSize:'24px',
           color:'green'
            }
        }
})

完整代碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>v-bind實(shí)例</title>
    <script type="text/javascript" src="../assets/js/vue.js"></script>
    <style>
        .classA {
            color: red;
        }
        .classB {
            font-size: 150%;
        }
    </style>
</head>
<body>
    <h1>v-bind實(shí)例</h1>
    <hr>
    <div id="app">
        <p><img v-bind:src="imgUrl" alt="" width="300px"></p>
        <p><a :href="blogUrl" target="_blank">我的博客地址</a></p>
        <hr>
        <div :class="className">1、綁定class屬性</div>
        <div :class="{classA: isClassA}">2、綁定class中的判斷</div>
        <div :class="[classA, classB]">3、綁定class中的數(shù)組</div>
        <div :class="isClassA?classA:classB">4、綁定class中的三元運(yùn)算符</div>
        <hr>
        <div>
            <input type="checkbox" id="isClassA" v-model="isClassA">
            <label for="isClassA">isClassA={{isClassA}}</label>
        </div>
        <hr>
        <div :style="{color:color,fontSize:font}">5、綁定style</div>
        <div :style="styleObj">5、對(duì)象綁定style</div>
    </div>

    <script type="text/javascript">
        var app = new Vue({
            el: '#app',
            data: {
                imgUrl: 'https://upload-images.jianshu.io/upload_images/1969310-c688f5d4d3a352b1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1000/format/webp',
                blogUrl: 'http://m.itdecent.cn/p/26010db3776c',
                className: 'classA',
                isClassA: false,
                classA: 'classA',
                classB: 'classB',
                color: 'red',
                font: '20px',
                styleObj: {
                    color: 'green',
                    fontSize: '24px'
                }
            }
        })
    </script>
</body>
</html>

1.7 其他指令

v-pre指令:

在模板中跳過vue的編譯,直接輸出原始值。就是在標(biāo)簽中加入v-pre就不會(huì)輸出vue中的data值了。

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

v-cloak指令:

在vue渲染完指定的整個(gè)DOM后才進(jìn)行顯示。可以防止數(shù)據(jù)抖動(dòng)。

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

v-once指令:

在第一次DOM時(shí)進(jìn)行渲染,渲染完成后視為靜態(tài)內(nèi)容,跳出以后的渲染過程。

<div v-once>第一次綁定的值:{{message}}</div>
<div><input type="text" v-model="message"></div>

完整代碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>v-pre & v-cloak & v-once</title>
    <script type="text/javascript" src="../assets/js/vue.js"></script>
</head>
<body>
    <h1>v-pre & v-cloak & v-once</h1>
    <hr>
    <div id="app">
        <div v-pre>{{message}}</div>
        <div v-cloak>渲染完成后,才顯示!</div>
        <div>{{message}}</div>
        <div><input type="text" v-model="message"></div>
        <div>{{message}}</div>
    </div>

    <script type="text/javascript">
        var app = new Vue({
            el: '#app',
            data: {
                message: 'hello world!'
            }
        })
    </script>
</body>
</html>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 這篇筆記主要包含 Vue 2 不同于 Vue 1 或者特有的內(nèi)容,還有我對(duì)于 Vue 1.0 印象不深的內(nèi)容。關(guān)于...
    云之外閱讀 5,187評(píng)論 0 29
  • vue概述 在官方文檔中,有一句話對(duì)Vue的定位說的很明確:Vue.js 的核心是一個(gè)允許采用簡(jiǎn)潔的模板語法來聲明...
    li4065閱讀 7,627評(píng)論 0 25
  • 1.安裝 可以簡(jiǎn)單地在頁面引入Vue.js作為獨(dú)立版本,Vue即被注冊(cè)為全局變量,可以在頁面使用了。 如果希望搭建...
    Awey閱讀 11,309評(píng)論 4 129
  • 主要還是自己看的,所有內(nèi)容來自官方文檔。 介紹 Vue.js 是什么 Vue (讀音 /vju?/,類似于 vie...
    Leonzai閱讀 3,556評(píng)論 0 25
  • 蘋果家族是建立小馬谷的家庭。它們的名字都和蘋果有關(guān)。就像蘋果羅絲、蘋果麗麗等。史密夫婆婆是全小馬谷最老的小馬,小馬...
    小花兒童飛天下一只恐龍和她很好閱讀 500評(píng)論 0 3

友情鏈接更多精彩內(nèi)容