1. 程式人生 > >05 vue 內部指令

05 vue 內部指令

Vue2.0 內部指令學習記錄

Hello World

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <script type="text/javascript"
src="../assets/js/vue.js">
</script> <title>Hello world</title> </head> <body> <h1>Hello World</h1> <hr> <div id="app">
{{message}} </div> <script type="text/javascript"> var app = new Vue({ el:'#app'
, data:{ message:'hello Vue!' } })
</script> </body> </html>
  1. script程式碼中先例項化 vue物件
  2. el 選項通過值#appid值為appdiv標籤進行關聯
  3. data選項作為返回資料
  4. 在關聯的div標籤中通過{{}} 來引用返回資料值

v-if & v-else & v-show

<!DOCTYPE html>
<html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>V-if&V-else&V-show</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">你好,zhangdd</div> <div v-else>你好,請先登入</div> <hr> <div v-show="isLogin">你好,zhangdd</div> </div> <script type="text/javascript"> var app =new Vue({ el:'#app', data:{ isLogin:true } }) </script> </body> </html>

v-ifvue的一個內部指令,指令用在html中用來判斷是否載入htmlDOM

  1. data選項中isLogintrue時顯示你好,zhangdd
  2. 當為false時顯示你好,請先登入

v-show 調整css中的display屬性值,根據isLogin的值來控制是否顯示

v-for

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>V-for 案例</title>
    <script type="text/javascript" src="../assets/js/vue.js"></script>
</head>
<body>
    <h1>V-for</h1>
    <hr>
    <div id="app">
        <ul>
            <li v-for="item in items1">
                {{item}}
            </li>
        </ul>
        <hr>
        <ul>
            <li v-for="item in sortItems">
                {{item}}
            </li>
        </ul>
        <hr>
        <ul>
            <li v-for="student in sortStudents">
                {{student.name}}-{{student.age}}
            </li>
        </ul>
    </div>
    <script type="text/javascript">
        var app =new new Vue({
            el:'#app',
            data:{
                items:[20,23,18,7,32,19,54,56,41],
                items1:[20,23,18,7,32,19,54,56,41],
                students:[
                    {name:'jspang',age:33},
                    {name:'panda',age:30},
                    {name:'lucky',age:26},
                    {name:'zhangdd',age:15}
                ]
            },
            computed:{
                sortItems:function(){
                    return this.items.sort(sortNumber);
                },
                sortStudents:function(){
                    return sortByKey(this.students,'age');
                }
            }
        })
        function sortNumber(a,b){
            return a-b;
        }

        //陣列物件方法排序:
        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>

v-for 指令是迴圈渲染data中的陣列,v-for指令需要以item in items的語法去使用items 是源資料陣列並且item是陣列元素迭代的別名。

  1. 做了三個迴圈的顯示,分別是

    • 無序按照原陣列順序進行顯示
    • 數字排序
    • 自定義排序
  2. computed 選項中做計算操作,需要注意的是該選項中如果不是對data選項的資料做賦值操作,需要重新定義一個匿名變數,同時html中在使用v-for指定進行迴圈使用時用新定義的這個。

v-text & v-html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <script type="text/javascript" src="../assets/js/vue.js"></script>
    <title>V-text & V-html</title>
</head>
<body>
    <h1>V-text & V-html </h1>
    <hr>
    <div id="app">
        <span>{{message}}</span>=<span v-text="message"></span>
        <hr>
        <span v-html="messageHtml"></span>
    </div>

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

html中輸出data選項中的值可以使用{{xxx}}來完成,但是這麼做存在一定的弊端,當網速很慢或者javascript出錯時在html中顯示的直接就是{{xxx}}v-text就是解決這個問題的。

  1. 通過v-text指定賦值data選項裡的內容就可以得到對應的值
  2. 同時保證了在javascript出錯或者網速慢的時候不會出現不友好的{{xxx}}現象

如果data選項中的值為html標籤,在通過{{xxx}} 或者v-text進行輸出時,現象是無法輸出或者原資料輸出,即無法解析。這個時候就需要使用v-html指定來完成操作了。

但是v-html指定在使用時有一定的弊端。在生產環境中動態渲染HTML是非常危險的,因為容易導致XSS攻擊。所以只能在可信的內容上使用v-html,永遠不要在使用者提交和可操作的網頁上使用

v-on

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>v-on 事件監聽器</title>
    <script type="text/javascript" src="../assets/js/vue.js"></script>
</head>
<body>
    <h1>v-on 事件監聽器</h1>
    <hr>

    <div id="app">
        本場比賽得分 {{count}}
        <br>
        <button v-on:click="addScore">加分</button>
        <button @click="descScore">減分</button>
        <br>
        <input type="text" v-on:keyup.enter="onEnter" v-model="secondScore">
    </div>

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

v-on就是監聽事件,可以用v-on指令監聽DOM事件來觸發一些javascript程式碼

另外v-on也有簡寫的方式通過@代替

  1. v-on:click="addScore"關聯一個addScore方法
  2. methods選項中實現對應方法
  3. 同樣的方式通過@click="descScore"關聯descScore方法
  4. methods選項中實現對應方法

另外還可以和鍵盤事件進行繫結

  1. v-on:keyup.enter="onEnter" 將回車鍵和onEnter方法進行關聯
  2. methods選項中實現對應的方法
  3. v-model 是資料來源的繫結即繫結值為data選項中對應的值

v-model

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>v-model 例項</title>
    <script type="text/javascript" src="../assets/js/vue.js"></script>
</head>

<body>
    <h1>v-model 例項</h1>
    <hr>
    <div id="app">
        <p>原始文字資訊</p>{{message}}
        <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>
        <h3>文字域</h3>
        <textarea cols="30" rows="10" v-model="message"></textarea>
        <h3>多選按鈕繫結一個值</h3>
        <input type="checkbox" id="isTrue" v-model="isTrue">
        <label for="isTrue">{{isTrue}}</label>
        <h3>多選繫結一個數組</h3>
        <input type="checkbox" id="JSPang" value="JSPang" v-model="web_name">
        <label for="JSPang">JSPang</label>
        <input type="checkbox" id="panda" value="panda" v-model="web_name">
        <label for="panda">panda</label>
        <input type="checkbox" id="panpan" value="panpan" v-model="web_name">
        <label for="panpan">panpan</label>
        <p>{{web_name}}</p>
        <h3>單選按鈕繫結</h3>
        <input type="radio" id="one" value="男" v-model="sex">
        <label for="one"></label>
        <input type="radio" id="two" value="女" v-model="sex">
        <label for="two"></label>
        <p>{{sex}}</p>
    </div>
    <script type="text/javascript">
        var app = new Vue({
            el: '#app',
            data() {
                return {
                    message: 'hello world',
                    isTrue: false,
                    web_name:[],
                    sex:'男'
                }
            }
        })
    </script>
</body>

</html>

v-model指定用來完成資料繫結的功能。

v-bind

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>v-bind 例項</title>
    <script type="text/javascript" src="../assets/js/vue.js"></script>
</head>

<body>
    <h1>v-bind 例項</h1>
    <hr>
    <div id="app">
        <p>
            <img v-bind:src="imgSrc" width="200px"></p>
        <p><a :href="web_url" target="_blank">百度</a></p>
        <hr>
        <div :class="className">1. 繫結Class</div>
        <div :class="{classA:isOk}">2. 繫結Class中的判斷</div>
        <input type="checkbox" id="isOk" v-model="isOk">
        <label for="isOk">{{isOk}}</label>
        <div :class="[classA,classB]">3. 繫結Class中的陣列</div>
        <div :class="isOk?classA:classB">4、繫結class中的三元表示式判斷</div>
        <div :style="{color:red,fontSize:font}">5、繫結style</div>
        <div :style="styleObject">6、用物件繫結style樣式</div>
    </div>
    <style>
        .classA {
            color: red }

        .classB {
            font-size: 150% }
    </style>
    <script type="text/javascript">
        var app = new Vue({
            el: '#app',
            data() {
                return {
                    imgSrc: 'https://www.baidu.com/img/bd_logo1.png?where=super',
                    web_url: 'https://www.baidu.com',
                    className: 'classA',
                    isOk: false,
                    classA: 'classA',
                    classB: 'classB',
                    red:'red',
                    font:'20px',
                    styleObject:{
                        color:'green',
                        fontSize:'24px'
                    }
                }
            }
        })
    </script>
</body>

</html>

v-bind是處理HTML中的標籤屬性的,和v-on``v-model同為繫結,只不過繫結的點不一樣

v-pre & v-cloak & v-once

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <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>

        <p v-once>第一次繫結的值: {{message}}</p>
        <input type="text" v-model="message">
        <div>{{message}}</div>
    </div>
    <script type="text/javascript">
        var app = new Vue({
            el: '#app',
            data() {
                return {
                    message: 'hello world'
                }
            }
        })
    </script>
</body>

</html>

v-pre 可以跳過vue的編譯直接輸出原始值即{{xxx}}

v-cloak 在頁面進行載入時,只有載入完成後才會顯示的內容

v-once 在第一次DOM時進行渲染,渲染完成後視為靜態內容,跳出以後的渲染過程

這裡寫圖片描述