1. 程式人生 > 實用技巧 >【Vue】Re04 指令:第二部分

【Vue】Re04 指令:第二部分

一、v-on指令

作用是用來將元素繫結事件監聽器,觸發特定的函式執行一定功能

關鍵字:事件監聽

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<div id="app">
    <p> <button v-on:click='theTest'>點我觸發事件</button></p>
<p> <button @click='theTest'>點我觸發事件(@縮寫語法)</button></p> </div> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> <script type="text/javascript"> let vm = new Vue({ el : '#app', data : { aaa : '233' }, methods : { theTest :
function ( ) { alert(this.aaa); } } }); </script> </body> </html>

v-on事件繫結的函式中引數傳遞的問題:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<
div id="v"> <!-- 演示事件監聽 + 引數執行 --> <button @click="fun01" >按鈕01</button> <button @click="fun01()">按鈕02</button> <hr> <!-- 帶參指向 --> <button @click="fun02(100)">按鈕03</button> <button @click="fun02">按鈕04</button> <hr> <!-- 列印事件 --> <button @click="fun03(222)">按鈕05</button> <button @click="fun03">按鈕06</button> <!-- 如果不注入引數呼叫列印,可以發現是一個事件在這個裡面 --> <hr> <!-- 如果存在多個引數 手動獲取瀏覽器事件物件,需要使用$event注入 --> <button @click="fun04($event, 222)">按鈕07</button> <button @click="fun04">按鈕08</button> <hr> <button>按鈕7</button> <button>按鈕08</button> </div> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> <script type="text/javascript"> const v = new Vue({ el : '#v', data : { message : 'Hello', }, methods : { fun01 : function () { console.log('無參呼叫測試'); }, fun02 : function (val) { console.log('帶參呼叫測試'); }, fun03(abc) { console.log(abc); }, fun04(event, abc) { // Vue預設第一個引數即為事件物件 console.log(event); console.log(abc); } } }); </script> </body> </html>

常用的修飾符使用:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<div id="v">
    <div @click="function02">
        <button @click="function01">testing1</button>
    </div> <!-- 我們點選按鈕,函式01和函式02都會被觸發,這樣的狀況被稱為冒泡 -->

    <hr>

    <!-- 如果我們希望其中的一個不要被觸發,可以使用.stop進行修飾 -->
    <div @click="function02"> <!-- 對div設定無效 -->
        the div tag content
        <button @click.stop="function01">testing2</button> <!-- 例如這裡只讓div上的事件生效 只要點選按鈕才會讓函式1生效 -->
    </div>

    <hr>

    <!-- .prevent修飾符用於阻止預設事件的觸發 -->
    <form action="#">
        <input type="text" name="username">
        <input type="text" name="password">
        <input type="submit" @click.prevent="function01" > <!-- 阻止表單提交,更改為使用自定義函式 -->
    </form>

</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script type="text/javascript">
    const v = new Vue({
        el : '#v',
        data : {
            message : 'sss'
        },
        methods : {
            function01() {
                console.log(' function01 -> ' + this.message);
            },
            function02() {
                console.log(' function02 -> ' + this.message);
            }
        }
    });
</script>

</body>
</html>

二、v-if、v-else-if、v-else指令

用於條件判斷控制元素是否顯示出來

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<!-- v-if v-else-if v-else -->
<div id="app">

    <p> <button @click="changeFlag">點我切換</button> </p>
    <p v-if="flag" > flag為true則顯示此資訊</p>

    <p> <button @click="changeScore">測試v-else-if</button> </p>
    
    <!-- 當指令的值符合為true時建立dom進行渲染,否則移除dom元素 -->
    <p v-if="score == 100">100分</p>
    <p v-else-if="score == 90">90分</p>
    <p v-else-if="score == 80">80分</p>
    <p v-else-if="score == 70">70分</p>
    <p v-else-if="score == 60">60分</p>
    <p v-else>不及格</p>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script type="text/javascript">
    let vm = new Vue({
        el : '#app',
        data : {
            flag : true,
            score : 100
        },
        methods : {
            changeFlag : function () {
                this.flag = !this.flag;
            },
            changeScore : function () {
                this.score -= 10;
            }
        }
    });
</script>

</body>
</html>

切換登入憑證的小案例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<div id="v">
    <p>
        <span v-if="isUser">
            <label for="username">使用者名稱稱:</label>
            <input type="text" id="username" placeholder="使用者名稱稱">
        </span>
        <span v-else>
            <label for="email">郵箱賬號:</label>
            <input type="text" id="email" placeholder="郵箱賬號">
        </span>
        
        <button @click="changeLoginWay" >切換登入方式</button>
        <button @click="isUser = !isUser" >切換登入方式[簡寫]</button>
    </p>
</div>
<!--<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>-->
<script src="./../dependencies/vue.js"></script>
<script type="text/javascript">
    const v = new Vue({
        el : '#v',
        data : {
            isUser : true
        },
        methods : {
            changeLoginWay() {
                this.isUser = !this.isUser;
            }
        }
    });
</script>

</body>
</html>

解決Input元素複用的問題

我們發現在使用者名稱輸入框輸入字元時,切換到郵箱賬號

發現輸入的字元被Vue儲存在郵箱賬號的輸入框中

也許真實的需求中就是希望這樣實現

但是一般情況應該是刪除清空的

解決辦法是使用Key屬性作為區分的標識:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<div id="v">
    <p>
        <span v-if="isUser">
            <label for="username">使用者名稱稱:</label>
            <input type="text" id="username" placeholder="使用者名稱稱" key="username">
        </span>
        <span v-else>
            <label for="email">郵箱賬號:</label>
            <input type="text" id="email" placeholder="郵箱賬號" key="email">
        </span>

        <button @click="changeLoginWay" >切換登入方式</button>
        <button @click="isUser = !isUser" >切換登入方式[簡寫]</button>
    </p>
</div>
<!--<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>-->
<script src="./../dependencies/vue.js"></script>
<script type="text/javascript">
    const v = new Vue({
        el : '#v',
        data : {
            isUser : true
        },
        methods : {
            changeLoginWay() {
                this.isUser = !this.isUser;
            }
        }
    });
</script>

</body>
</html>

三、v-show指令

決定指令繫結的元素是否需要在頁面中顯示

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<!-- v-show是純粹的v-if -->
<div id="app">
    <p v-show="!flag"> show this tag 1 </p>
    <p v-show="100 > 2"> show this tag 2 </p>
    <p v-show="true == true"> show this tag 3 </p>
    <p v-show="false == false"> show this tag 4 </p>
    <p v-show="2 < 1"> show this tag 5 </p>
</div>
<!--
    v-if 和 v-show的區別
    雖然二者都是判斷條件來實現元素的是否顯示在瀏覽器上
    但是:
    v-if是直接不建立dom元素實現
    v-show是建立了dom元素但是使用display:none屬性進行了隱藏處理

    適用的場景,如果需要頻繁的顯示隱藏元素的話更適合使用v-show處理
    如果使用v-if則需要反覆建立dom可能造成記憶體浪費
-->
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<!--<script src="./../dependencies/vue-min.js"></script>-->
<script type="text/javascript">
    let vm = new Vue({
        el : '#app',
        data : {
            flag : true
        }
    });
</script>

</body>
</html>

注意v-show和v-if的區別:

v-if 和 v-show的區別 雖然二者都是判斷條件來實現元素的是否顯示在瀏覽器上

但是: v-if是直接不建立dom元素實現 v-show是建立了dom元素但是使用display:none屬性進行了隱藏處理

適用的場景,如果需要頻繁的顯示隱藏元素的話更適合使用v-show處理

如果使用v-if則需要反覆建立dom可能造成記憶體浪費

四、v-for指令

普通陣列遍歷

物件屬性遍歷

物件陣列遍歷

索引獲取,key + value獲取

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<div id="v">
    <!-- 普通遍歷使用 -->
    <ul>
        <li v-for="n in names">{{n}}</li>
    </ul>

    <!-- 獲取索引下標 index, 這裡的索引是第二引數即可 -->
    <ul>
        <li v-for="(n, i) in names">{{i}} - {{n}}</li>
    </ul>

    <!-- 遍歷物件的屬性和值 -->
    <ul><!-- 只有一個引數,獲取的是值 -->
        <li v-for="k in obj">{{k}}</li>
    </ul>
    <ul><!-- 兩個引數 引數1是屬性值,引數二是屬性名,獲取的是值 -->
        <li v-for="(v, k) in obj">{{k}} {{v}}</li>
    </ul>
    <ul><!-- 便利物件屬性也支援獲取下標 -->
        <li v-for="(v, k, i) in obj">{{i}} {{k}} {{v}}</li>
    </ul>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script type="text/javascript">
    const v = new Vue({
        el : '#v',
        data : {
            names : ['wan', 'why', 'james'],
            obj : {
                name : '傑哥',
                age : 24,
                gender : false
            }
        },

    });
</script>

</body>
</html>