vue框架 v-*的指令


vue框架 v-*的指令

"""
1、簡述vue框架的作用和優勢
	作用:開發前后台分離項目
	優勢:前后台分離(開發效率)、輕量級(開發效率)、中文API(學習成本)
	框架的特點:數據驅動、虛擬DOM、單頁面應用(很好適配移動端項目)、數據的雙向綁定(監聽機制)

2、列舉出三個vue的指令,並簡述每個指令的用法
	v-text:  v-text="變量",類似{{ 變量|基本類型|簡單表達式 }} => 設置文本
	v-html:  可以解析有html語法的文本 => 設置html文本
	v-on:	v-on:事件名="方法名"  |  v-on:事件名="方法名($event, ...)" => 設置事件
	<div v-*=""> </div>

3、列舉出至少三個vue實例成員,並簡述每個實例成員的用法
	el: id選擇器,body html不能作為掛載點,只匹配一個
	data:提供渲染的數據
	methods:提供綁定的方法
	delimiters:插值表達式標識符, ['{{', '}}']
	filters:提供自定義過濾器,過濾器可以同時過濾多個參數,還可以串聯過濾器
	
	let data = {}
	new Vue({
		'el': '#app',
		data,
		...
	})
4、js補充
	對象
	類:class function
	類屬性:Vue.prototype.類屬性
	函數:let fn = () => {}
"""

大綱

"""
1)指令
	屬性指令:v-bind
	表達指令:v-model
	條件指令:v-show v-if
	循環指令:v-for
	斗篷指令:v-cloak
	
2)實例成員
	計算:computed
	監聽:watch
	
3)vue項目環境
"""

斗篷指令(了解)

v-cloak:避免屏幕閃爍

"""
v-cloak:避免屏幕閃爍
1)屬性選擇器,會將v-cloak屬性所在的標簽隱藏
2)當vue環境加載后,會將v-cloak屬性解析移除,所以內容{{ num }}就會顯示出來
3)而現在vue已經准備完畢,所以用戶會直接看到數值10,而不會看到 頁面從{{ num }}閃爍成數值10    """
<style>
    [v-cloak] {
        display: none;
    }
</style>
<div id="app" v-cloak>
    <p>{{ num }}</p>
</div>
<script>
    new Vue({
        el: '#app',
        data: {
            num: 10
        },
    })
</script>




<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title></title>
    <style>
        /**
        1)屬性選擇器,會將v-cloak屬性所在的標簽隱藏
        2)當vue環境加載后,會將v-cloak屬性解析移除,所以內容{{ num }}就會顯示出來
        3)而現在vue已經准備完畢,所以用戶會直接看到數值10,而不會看到 頁面從{{ num }}閃爍成數值10
        */
        [v-cloak] {
            display: none;
        }
    </style>
</head>
<body>
    <div id="app" v-cloak>
        <p v-on:click="fn">{{ num }}</p>
    </div>
</body>
<script src="js/vue.js"></script>
<script>
    // v-cloak:避免屏幕閃爍
    new Vue({
        el: '#app',
        data: {
            num: 10
        },
        methods: {
            fn () {
                if (this.num <= 0) {
                    return false;
                }
                this.num -= 2
            }
        }
    })
</script>
</html>

結果:

屬性指令

屬性指令:v-bind:屬性名="變量"

"""
/** 屬性指令
* 1)語法:v-bind:屬性名="變量"
* 2)針對不同屬性,使用方式稍微有一丟丟區別
*      i)自定義屬性以及title這些,直接賦值的,使用方式如下(t是變量,'o'是常量)
*          <p v-bind:title="t" v-bind:owen="'o'">段落</p>
*      ii)class屬性(重點):
*          綁定的變量:值可以為一個類名 "p1",也可以為多個類名 "p1 p2"
*          綁定的數組:數組的每一個成員都是一個變量
*          綁定的字典:key就是類名,value是絕對該類名是否起作用
*      iii)style屬性(了解):
*          綁定的變量:值是一個字典
*/
"""
<p v-bind:title="t" v-bind:owen="'o'">段落</p>
<script>
    new Vue({
        el: '#app',
        data: {
            t: '懸浮提示',
        },
    })
</script>
<!-- 
a是變量,值就是類名
b就是類名,不是變量
c是變量,值為布爾,決定b類是否起作用
d是變量,值可以為一個類名 'p1' 也可以為多個類名 "p1 p2 ..."
calss="p1 b p2 p3"
-->
<p v-bind:class="[a, {b: c}]" v-bind:class="d"></p> 
<script>
    let app = new Vue({
        el: '#app',
        data: {
            a: 'p1',
            c: true,
            d: 'p2 p3',
        },
    })
</script>
<p v-bind:style="myStyle"></p>
<script>
    let app = new Vue({
        el: '#app',
        data: {
            myStyle: {
                width: '50px',
                height: '50px',
                backgroundColor: 'pink',
                borderRadius: '50%'
            }
        },
    })
</script>
案例
<button v-bind:class="{live: isLive == 1}" v-on:click="changeLive(1)">1</button>
<button v-bind:class="{live: isLive == 2}" v-on:click="changeLive(2)">2</button>
<button v-bind:class="{live: isLive == 3}" v-on:click="changeLive(3)">3</button>
<script>
    let app = new Vue({
        el: '#app',
        data: {
            isLive: 1,
        },
        methods: {
            changeLive (index) {
                // this就代表當前vue對象,和app變量等價
                // app.isLive = index;
                this.isLive = index;
            }
        }
    })
</script>  
重點:事件指令與屬性指令都可以簡寫
<!--
1)v-bind: 可以簡寫為 :
2)v-on: 可以簡寫為 @
-->

<button v-bind:class="{live: isLive == 1}" v-on:click="changeLive(1)">1</button>
<button :class="{live: isLive == 2}" @click="changeLive(2)">2</button>
<button :class="{live: isLive == 3}" @click="changeLive(3)">3</button>

事件補充

<style>
    body {
        /* 不允許文本選中 */
        user-select: none;
    }
    .d1:hover {
        color: orange;
        /* 鼠標樣式 */
        cursor: pointer;
    }
    /* 只有按下采用樣式,抬起就沒了 */
    .d1:active {
        color: red;
    }
    /* div標簽壓根不支持 :visited 偽類 */
    .d1:visited {
        color: pink;
    }

    .d2.c1 {
        color: orange;
    }
    .d2.c2 {
        color: red;
    }
    .d2.c3 {
        color: pink;
    }
</style>
<div id="app">
    <div class="d1">偽類操作</div>
    <br><br><br>
    <!--
    click: 單擊
    dblclick:雙擊
    mouseover:懸浮
    mouseout:離開
    mousedown:按下
    mouseup:抬起
    -->
    <div :class="['d2', c]" @click="hFn('c1')" @mouseover="hFn('c2')" @mousedown="hFn('c3')">事件處理</div>
</div>
<script>
    new Vue({
        el: '#app',
        data: {
            c: '',
        },
        methods: {
            hFn (c) {
                this.c = c
            }
        }
    })
</script>

表單指令

v-model="變量"

"""
1)語法:v-model="變量"
2)v-model綁定的變量控制的其實就是value屬性值
3)v-model要比v-bind:value要對一個監聽機制
4)數據的雙向綁定:
	v-model可以將綁定的變量值映射給表單元素的value
	v-model還可以將表單元素的新value映射給報道的變量
"""
<!-- 兩個輸入框內容會同時變化 -->
<input name="n1" type="text" v-model="v1">
<input name="n2" type="text" v-model="v1">
<script>
    new Vue({
        el: '#app',
        data: {
            v1: ''
        }
    })
</script>

代碼:

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>表單指令</title>
</head>
<body>
    <div id="app">
        <form action="" method="">
<!--            <input name="n1" type="text" :value="v1">-->
<!--            <input name="n2" type="text" :value="v1">-->

            <!--
                1)語法:v-model="變量"
                2)v-model綁定的變量控制的其實就是value屬性值
                3)v-model要比v-bind:value要對一個監聽機制
                4)數據的雙向綁定:
                    v-model可以將綁定的變量值映射給表單元素的value
                    v-model還可以將表單元素的新value映射給報道的變量
            -->
            <input name="n1" type="text" v-model="v1">
            <input name="n2" type="text" v-model="v1">
            <p @click="v1 = '點擊了'">{{ v1 }}</p>

            <button type="submit">提交</button>
        </form>
    </div>
</body>
<script src="js/vue.js"></script>
<script>
    new Vue({
        el: '#app',
        data: {
            v1: '123'
        }
    })
</script>
</html>

結果:

條件指令

v-show="變量" | v-if="變量"

"""
/**
* 1)語法:v-show="變量"  |  v-if="變量"
* 2)兩者的區別:
*      v-show在隱藏標簽時,采用display:none渲染標簽,標簽通過css隱藏
*      v-if在隱藏標簽時,不會渲染在頁面上
*
* 3)v-if有家族:v-if | v-else-if | v-else
*      v-if是必須的,必須設置條件
*      v-else-if可以為0~n個,必須設置條件
*      v-else可以為0~1個
*      上方分支成立會屏蔽下方所有分支,從上至下依次類推
*/
"""
<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <div id="app">
        <div>
            <p v-show="isShow">show控制顯隱</p>
            <p v-if="isShow">if控制顯隱</p>
        </div>

        <div>
            <p v-if="0">你是第1個p</p>
            <p v-else-if="0">你是第2個p</p>
            <p v-else>你是第3個p</p>
        </div>

    </div>
</body>
<script src="js/vue.js"></script>
<script>
    /**
     * 1)語法:v-show="變量"  |  v-if="變量"
     * 2)兩者的區別:
     *      v-show在隱藏標簽時,采用display:none渲染標簽,標簽通過css隱藏
     *      v-if在隱藏標簽時,不會渲染在頁面上
     *
     * 3)v-if有家族:v-if | v-else-if | v-else
     *      v-if是必須的,必須設置條件
     *      v-else-if可以為0~n個,必須設置條件
     *      v-else可以為0~1個
     *      上方分支成立會屏蔽下方所有分支,從上至下依次類推
     */
    new Vue({
        el: '#app',
        data: {
            isShow: false,
        }
    })
</script>
</html>

結果:

案例
<style>
    body {
        margin: 0
    }
    button {
        width: 60px;
        line-height: 40px;
        float: right;
    }
    .bGroup:after {
        display: block;
        content: '';
        clear: both;
    }
    .box {
        /* vw: view width  vh: view height*/
        width: 100vw;
        height: 200px;
    }
    .red {
        background-color: red;
    }
    .green {
        background-color: green;
    }
    .blue {
        background-color: blue;
    }

    button.active {
        background-color: cyan;
    }
</style>

<div id="app">
    <div class="bGroup">
        <button :class="{active: isShow === 'red'}" @click="isShow = 'red'">紅</button>
        <button :class="{active: isShow === 'green'}" @click="isShow = 'green'">綠</button>
        <button :class="{active: isShow === 'blue'}" @click="isShow = 'blue'">藍</button>
    </div>
    <div>
        <div v-if="isShow === 'red'" class="box red"></div>
        <div v-else-if="isShow === 'green'" class="box green"></div>
        <div v-else class="box blue"></div>
    </div>
</div>

<script>
    new Vue({
        el: '#app',
        data: {
            isShow: 'red'
        }
    })
</script>

結果:

循環指令

v-for="ele in obj" 循環指令

"""
/**
* 1)語法:v-for="ele in obj"  obj是被遍歷的對象,ele是遍歷得到的每一次結果
* 2)遍歷可迭代對象的首要結果,都是可迭代對象容器中的值,其次還可以遍歷得到索引及鍵等數據
*      字符串:v-for="v in str"  |  v-for="(v, i) in str"
*      數組:v-for="v in arr"  |  v-for="(v, i) in arr"
*      對象:v-for="v in obj"  |  v-for="(v, k) in obj"  |  v-for="(v, k, i) in obj"
* 注:v-for遍歷要依賴於一個所屬標簽,該標簽及內部所有內容會被遍歷復用
*/
"""
<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>循環指令</title>
</head>
<body>
    <div id="app">
        <!-- 遍歷數字
		5
		【1】【2】【3】【4】【5】
		-->
        <p>{{ d1 }}</p>
        <i v-for="e in d1">【{{ e }}】</i>
        <hr>

        <!-- 遍歷字符串
		abc
		【a】【b】【c】
		【0a】【1b】【2c】
		-->
        <p>{{ d2 }}</p>
        <i v-for="e in d2">【{{ e }}】</i>
        <i v-for="(e, i) in d2">【{{ i }}{{ e }}】</i>
        <hr>

        <!-- 遍歷數組
		[ 1, 3, 5 ]
		【1】【3】【5】
		【01】【13】【25】
		-->
        <p>{{ d3 }}</p>
        <i v-for="e in d3">【{{ e }}】</i>
        <i v-for="(e, i) in d3">【{{ i }}{{ e }}】</i>
        <hr>

        <!-- 遍歷對象
		{ "name": "Bob", "age": 17.5, "gender": "男" }
		【Bob】【17.5】【男】
		【name-Bob】【age-17.5】【gender-男】
		【name-Bob-0】【age-17.5-1】【gender-男-2】
		-->
        <p>{{ d4 }}</p>
        <i v-for="e in d4">【{{ e }}】</i>
        <i v-for="(e, k) in d4">【{{ k }}-{{ e }}】</i>
        <i v-for="(e, k, i) in d4">【{{ k }}-{{ e }}-{{ i }}】</i>
        <hr>

    </div>
</body>
<script>
    new Vue({
        el: '#app',
        data: {
            d1: 5,
            d2: 'abc',
            d3: [1, 3, 5],
            d4: {
                name: "Bob",
                age: 17.5,
                gender: "男"
            }
        }
    })
</script>

結果:

商品循環案例
<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>循環案例</title>
    <style>
        .box {
            width: 280px;
            border: 1px solid #eee;
            border-radius: 5px;
            overflow: hidden; /* 隱藏超出父級顯示范圍外的內容 */
            text-align: center; /* 文本相關的屬性大多默認值是inherit */
            float: left;
            margin: 10px;
        }
        .box img {
            width: 100%;
        }

    </style>
</head>
<body>
    <div id="app">


        <div class="box" v-for="obj in goods">
            <img :src="obj.img" alt="">
            <p>{{ obj.title }}</p>
        </div>

    </div>
</body>
<script src="js/vue.js"></script>
<script>


    // 前台先制作假數據進行測試
    let goods = [
        {
            "img": "https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=2457147274,3329097728&fm=26&gp=0.jpg",
            "title": "純種拆家專家"
        },
        {
            "img": "https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=2457147274,3329097728&fm=26&gp=0.jpg",
            "title": "純種拆家專家"
        },
        {
            "img": "https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=2457147274,3329097728&fm=26&gp=0.jpg",
            "title": "純種拆家專家"
        }
    ];

    new Vue({
        el: '#app',
        data: {
            goods,
        }
    })
</script>
</html>

結果:

面試題:todolist

js的Array操作
"""
尾增:arr.push(ele)  
首增:arr.unshift(ele)
尾刪:arr.pop()
首刪:arr.shift()
增刪改插:arr.splice(begin_index, count, args)
"""

前台數據庫
"""
// 存
// 持久化化存儲,永遠保存
localStorage.name = "Bob";
// 持久化化存儲,生命周期同所屬標簽(頁面),頁面關閉,重新打開就會丟失
sessionStorage.name = "Tom";

// 取
console.log(localStorage.name);
console.log(sessionStorage.name);

// 清空
localStorage.clear();
sessionStorage.clear();

// 短板:只能存儲字符串,所有對象和數組需要轉換為json類型字符串,再進行存儲
let a = [1, 2, 3];
localStorage.arr = JSON.stringify(a);
let b = JSON.parse(localStorage.arr);
console.log(b);
"""

案例:留言板
<style>
    li:hover {
        color: red;
        cursor: pointer;
    }
</style>

<div id="app">
    <form>
        <input type="text" v-model="info">
        <button type="button" @click="sendInfo">留言</button>
    </form>
    <ul>
        <li v-for="(info, index) in info_arr" @click="deleteInfo(index)">{{ info }}</li>
    </ul>
</div>

<script>
    new Vue({
        el: '#app',
        data: {
            info: '',
            // 三目運算符: 條件 ? 結果1 : 結果2
            info_arr: localStorage.info_arr ? JSON.parse(localStorage.info_arr) : [],
        },
        methods: {
            sendInfo () {
                // 完成留言:將info添加到info_arr
                // 增 push unshift | 刪 pop shift
                if (this.info) {
                    // 留言
                    this.info_arr.push(this.info);
                    // 清空輸入框
                    this.info = '';
                    // 前台數據持久化(緩存)
                    localStorage.info_arr = JSON.stringify(this.info_arr);
                }
            },
            deleteInfo(index) {
                // 刪
                this.info_arr.splice(index, 1);
                // 同步給數據庫
                localStorage.info_arr = JSON.stringify(this.info_arr);
            }
        }
    })
</script>

結果:

小結

"""
1、v-cloak斗篷指令
2、屬性指令
	v-bind:title="變量"
	:class="變量" | :class="[變量1, ..., 變量n]"  |  :class="{類名: 布爾變量}"
	:style="字典變量"
3、事件:@click @dblclick @mouseover|out|down|up
	鼠標單擊、雙擊、懸浮、移開、按下、抬起
4、表單指令:
	v-model綁定變量控制value屬性,可以實現雙向綁定
5、條件指令:
	v-show | v-if
	v-if | v-else-if | v-else
6、循環指令:
	字符串:v-for="v in str"  |  v-for="(v, i) in str"
    數組:v-for="v in arr"  |  v-for="(v, i) in arr"
    對象:v-for="v in obj"  |  v-for="(v, k) in obj"  |  v-for="(v, k, i) in obj"
    
7、Array操作
	arr.push(ele)  arr.unshift(ele)
	arr.pop()  arr.shift()
	arr.splice(begin_index, count, args)

8、前台數據庫
	localStorage | sessionStorage
	1)操作就類似於obj,直接 .key 語法訪問 value
	2)localStorage永久存儲
	3)sessionStorage生命周期同所屬頁面標簽
	
"""



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM