vue2


表單指令

v-model="變量",變量值與表單的value相關,placeholder屬性是input框的默認值,v-model可以實現數據的雙向綁定,變量的值可以影響表單標簽的值,反過來標簽的值也可以影響變量的值。

  <!--普通input框雙向綁定 -->      
<input type="text" name="usr" id="usr" placeholder="請輸入賬號" v-model="v1">
<input type="text" v-model="v1">
{{ v1 }}

<!--1.單選框-->
男:<input type="radio" name="gender" value="male" v-model="v2">
女:<input type="radio" name="gender" value="female" v-model="v2">
<hr>
性別:{{ v2 }}

<hr>

<!--2.單一復選框-->
是否同意相關條款:同意 <input type="checkbox" name="agree" v-model="v3">
	{{ v3 }}

	<hr>
<!--3.多復選框-->
愛好:<br>
男:<input type="checkbox" name="hobbies" value="male" v-model="v4">
女:<input type="checkbox" name="hobbies" value="female" v-model="v4">
其他:<input type="checkbox" name="hobbies" value="other" v-model="v4">
{{ v4 }} 
<!-- 這里{{v4}}通過數組存取值,選中哪個選項就將其存放到數組中 [ "male", "female", "other" ] -->
<hr>

vue中各變量的默認值

<script src="vue.js"></script>
<script>
    new Vue({
        el: '#app',
        data: {
            v1: '123',
            v2: 'male',
            v3: false,
            v4: ['male', 'female']
        }
    })
</script>
普通input框:變量就代表value值
單選框:變量為多個單選框中的某一個value值
單一復選框:變量為布爾類型,代表是否選中
多復選框:變量為數組,存放選中的選項value

條件指令

v-show:  display:none#將標簽隱藏起來不顯示,但是瀏覽器已將渲染了,這種方式瀏覽器會加載過多的不需要的內容
v-if:    #不渲染條件不成立的標簽
v-if | v-else-if | v-else

條件指令具體使用方法如下例:

<div id="app" v-cloak>
        <!--條件指令:
            v-show="布爾變量"   隱藏時,采用display:none進行渲染
            v-if="布爾變量"     隱藏時,不在頁面中渲染(保證了未渲染頁面的數據安全)
            -----------------------------
            v-if | v-else-if | v-else
        -->
      <!--  <div class="box r" v-show="is_show"></div>
        <div class="box b" v-if="is_show"></div>
        <hr> -->
        <div class="wrap">
            <div>
                <button @click="page='r_page'" :class="{r: page === 'r_page'}">紅</button>
                <button @click="page='b_page'" :class="{b: page === 'b_page'}">藍</button>
                <button @click="page='g_page'" :class="{g: page === 'g_page'}">綠</button>
            </div>
            <div class="box r" v-if="page === 'r_page'"></div><!-- 如果條件成立則展示這個div -->
            <div class="box b" v-else-if="page === 'b_page'"></div><!-- 如果條件成立則展示這個div -->
            <div class="box g" v-else></div><!-- 如果條件成立則展示這個div	 -->	
        </div>
    </div>
</body>
<script src="vue.js"></script>
<script>
    new Vue({
        el: '#app',
        data: {
            <!-- is_show: false, --><!-- 這里也可以通過控制is_show的狀態來控制標簽的展示 -->
            page: 'r_page'
        },	
    })
</script>

循環指令

這里的for循環可以循環string、array、obj數據類型。

v-for="(v, i) in str|arr"
#v是元素,i是索引
v-for="(v, k, i) in dic"
# v是值,k是屬性,i是屬性的索引

具體程序如下例:

 <div id="app">
        <!--循環指令:
            v-for="ele in string|array|obj"
        -->
        <span>{{ info }}</span>
        <hr>
        <i v-for="c in info">{{ c }} </i>
        <hr>
        <i v-for="(v, i) in info">{{i}}:{{v}}<br></i>
        <hr>

        <div v-for="e in stus">{{ e }}</div>
        <hr>
        <div v-for="(e, i) in stus">{{ i }}:{{ e }}</div>
        <hr>

        <div v-for="v in people">{{ v }}</div>
        <hr>
        <div v-for="(v, k, i) in people">{{ i }} - {{ k }}:{{ v }}</div>
        <hr>
		</div>
		</div>
		</body>
		<script src="vue.js"></script>
		<script>
		    new Vue({
		        el: '#app',
		        data: {
		            info: 'Big big one',
		            stus: ['Bob', 'Tom', 'Jerry'],
					})

例子:以下面的形式展示用戶對象的信息:

name:tom | age:21 | gender:男
name:jane | age:20 | gender:女

這里我們可以通過for循環嵌套if判斷來完成題目要求

<body>
    <div id="app">
        <!--循環指令:
            v-for="ele in string|array|obj"
        -->
        <hr>
        <div v-for="tea in teas">
            <span v-for="(v, k, i) in tea"><span v-if="i !== 0"> | </span>{{ k }}:{{ v }}</span>
        </div>   
</body>
<script src="vue.js"></script>
<!-- 我們在這里引入vue而不是選擇在head標簽引入vue是因為代碼
的加載順序,如果將其放在head內則會先加載vue,如果在網速較慢時頁面的加載速度很慢,如果
將其放在下面,就會先加載body內的內容,只是渲染的速度比較慢,這樣的用戶體驗會更好。 -->
<script>
    new Vue({
        el: '#app',
        data: {
            teas: [
                {
                    name: 'tom',
                    age: 21,
                    gender: '男',
                },
                {
                   name: 'jane',
                   age: 20,
                   gender: '女',
                }
            ]
        }
    })
</script>

循環指令案例

需求描述

模仿留言框做一個輸入框,可以輸入數據,當提交后數據會顯示在留言框的下方,
當刷新頁面時留言的內容依然存在,留言的刪除:當用鼠標點擊某一條留言時,留言可以自動刪除。

前台數據庫介紹

該案例需要用到前台數據庫來存儲數據,前台數據庫有兩類:localStorage、sessionStorage。
localStorage可以永久存儲數據,當頁面重新刷新的時候數據仍保留在數據庫中,數組數據類型數據存
入該數據庫的方式通過JSON.stringify將其序列化為json然后存入數據庫,普通數據存儲方式如下:

 // 存數據的方式
// localStorage.n1 = 10;
// sessionStorage.n2 = 20;

// 取
// console.log(localStorage.n1);
// console.log(sessionStorage.n2);

// 數組等類型需要先序列化成JSON
// localStorage.arr = JSON.stringify([1, 2, 3]);
// console.log(JSON.parse(localStorage.arr));

// 清空數據庫
// localStorage.clear();

sessionStorage用於臨時存儲數據(所屬頁面標簽被關閉后就清空,刷新頁面數據清空)。

案例實現代碼

這里我們使用數組去接收添加的每一條評論,可以使用對數組元素的增刪來實現留言的增刪,
使用到的操作數組的方法如(unshift首增 、push 尾增 、 shift首刪 、pop 尾刪),
splice(begin_index, count, ...args)的使用方法(...args是可變長參數):

<head>
    <meta charset="UTF-8">
    <title>todo list 案例</title>
    <style>
        li:hover {
            color: red;
            cursor: wait;
        }
    </style>
</head>
<body>
    <div id="app">
        <input type="text" v-model="comment">
        <button type="button" @click="send_msg">留言</button>
        <ul>
            <li v-for="(msg, i) in msgs" @click="delete_msg(i)">{{ msg }}</li>
        </ul>
    </div>
</body>
<script src="vue.js"></script>
<script>
    new Vue({
        el: '#app',
        data: {
            comment: '',
            msgs: localStorage.msgs ? JSON.parse(localStorage.msgs) : [],
				// 三元表達式,如果?前面的條件成立,執行:前面的,如果不成立執行后面的。
				// 這里是當條件成立則將其序列化到內存中
        },
        methods: {
            send_msg() {
                // 將comment添加到msgs數組中:unshift首增 push 尾增 | shift首刪 pop 尾刪
                // this.msgs.push(this.comment);

                // 數組操作最全方法:splice(begin_index, count, ...args)
                // this.msgs.splice(0, 2);

                if (!this.comment) {
                    alert('請輸入內容');
                    return false;
                }
                this.msgs.push(this.comment);
                this.comment = '';

                localStorage.msgs = JSON.stringify(this.msgs);
            },
            delete_msg(index) {
                this.msgs.splice(index, 1);
                localStorage.msgs = JSON.stringify(this.msgs);
            }
        }
    })
</script>

分隔符

當我們在Django中使用vue時,vue的插值符號與Django的模板語法中的{{}}沖突,這時就需要我們使用分隔符號
為vue重新設置一個插值符,具體設置方法如下。

分隔符:delimiters: ['{{', '}}']
<script>
    new Vue({
        el: '#app',
        data: {
            msg: 'message'
        },
        delimiters: ['[{', '}]'],  // 修改插值表達式符號
    })
</script>

過濾器

過濾器:傳入要過濾的條件,返回值就是過濾的結果

1.在filters成員中定義過濾器方法

2.可以對多個值進行過濾,過濾時還可以額外傳入輔助參數

3.過濾的結果可以再進行下一次過濾(過濾的串聯)

{{ n1, n2 | f1(30) | f2 }}

filters: {
    f1(n1,n2,n3) {return f1過濾結果},
    f2(f1的過濾結果) {return f2過濾結果},
}


具體使用方法如下:

<body>
    <div id="app">
        <p>{{ num | f1 }}</p>
        <p>{{ a, b | f2(30, 40) | f3 }}</p>
    </div>
</body>
<script src="js/vue.js"></script>
<script>
    new Vue({
        el: '#app',
        data: {
            num: 10,
            a: 10,
            b: 20,
        },
        filters: {
            // 傳入所有要過濾的條件,返回值就是過濾的結果
            f1 (num) {
                console.log(num);
                return num * 10;//值在return時仍可以進行一些簡單的運算
            },
            f2 (a, b, c, d) {
                console.log(a, b, c, d);
                return a + b + c + d;
            },
            f3 (num) {
                return num * num;
            }
        }
    })
</script>

計算屬性

1.computed計算屬性可以聲明方法屬性,方法屬性一定不能在data中重復聲明

2.方法屬性必須在頁面中渲染。才會啟用綁定的方法,方法屬性的值就是綁定方法的返回值

3.綁定的方法中出現的所有變量都會被監聽,任何一個變化發生值更新都會重新出發綁定方法,從而更新方法屬性的值

4.一般用來實現的功能:一個變量值依賴於多個變量的變化而變化如下面的例子。

例子:兩個input框,向兩個框內輸入不同的數字,在第三個框顯示前兩個框的數字之和。

代碼實現如下:

<body>
	    <div id="app">
	        <input type="number" min="0" max="100" v-model="n1"> <!-- min="0" max="100"設置數字的范圍 -->
	        +
	        <input type="number" min="0" max="100" v-model="n2">
	        =
	        <button>{{ result }}</button>
	    </div>
	</body>
	<script src="vue.js"></script>
	<script>
	    new Vue({
	        el: '#app',
	        data: {
	            n1: '',//定義n1、n2的默認值
	            n2: '',
	            // result: 0,
	        },
	        computed: {//computed會時刻監測n1、n2的變化,一旦變化就執行
	            result () {
	                console.log('被調用了');
	                n1 = +this.n1;
	                n2 = +this.n2;
	                return n1 + n2;
	            }
	        }
	    })
	</script>

監聽屬性

當b、c、d等變量的值需要依賴a的值的變化而變化時,就需要用到監聽屬性,將a設置為監聽屬性,一旦a屬性的屬性值發生變化,與之關聯的其他屬性的屬性值也隨之變化。

監聽屬性的特點

1.監聽的屬性需要在data中聲明,監聽方法不需要返回值
2.監聽的方法名就是監聽的屬性名,該屬性值發生更新時就會回調監聽方法
3.監聽方法有兩個回調參數:當前值,上一次值

應用場景:當多個變量值依賴於一個變量值的改變而改變時使用

例子:在input框中輸入一個中文姓名,自動將其姓氏和名字分開顯示。

<body>
    <div id="app">
        <p>姓名:<input type="text" v-model="full_name"></p>
        <p>姓:{{ first_name }}</p>
        <p>名:{{ last_name }}</p>
    </div>
</body>
<script src="vue.js"></script>
<script>
    new Vue({
        el: '#app',
        data: {
            full_name: '',
            first_name: '未知',
            last_name: '未知',
        },
        watch: {
            // n是監聽的屬性當前值,o是其上一次的值,監聽的屬性值每次更新都會回調監聽方法
            full_name(n, o) {
                name_arr = n.split('');
                this.first_name = name_arr[0];
                this.last_name = name_arr[1];
            },
        }
    })
</script>

冒泡排序

	for (let i=0; i<arr.length-1; i++) {  // 趟數
        for (let j=0; j<arr.length-1-i; j++) {  // 比較次數
            // 處理條件即可
            if (arr[j]參數 > stus[j + 1]參數) {
                let temp = stus[j];
                stus[j] = stus[j + 1];
                stus[j + 1] = temp;
            }
        }
    }

例子1:對一個數組內的所有數字進行排序

let arr = [3, 2, 5, 4, 1];
console.log(arr);

// 冒泡排序
// 3, 2, 5, 4, 1

// 2, 3, 4, 1, 5
// 2, 3, 1, 4
// 2, 1, 3
// 1, 2
for (let i = 0; i < arr.length - 1; i++) {  // 外層循環控制趟數
	for (let j = 0; j < arr.length - 1 - i; j++) {  // 內存循環控制比較次數
		if (arr[j] > arr[j + 1]) {
			let temp = arr[j];
			arr[j] = arr[j + 1];
			arr[j + 1] = temp;
		}
	}
}
    console.log(arr);

例子2:對數組內的對象按成績進行排序

stus = [
	{
		name: 'Bob',
		grade: 98
	},
	{
		name: 'Tom',
		grade: 87
	},
	{
		name: 'Jerry',
		grade: 92
	},
];
// 按照分數進行排名
for (let i=0; i<stus.length-1; i++) {
	for (let j=0; j<stus.length-1-i; j++) {
		// 處理條件即可
		if (stus[j].grade > stus[j + 1].grade) {
			let temp = stus[j];
			stus[j] = stus[j + 1];
			stus[j + 1] = temp;
		}
	}
}

console.log(stus);

JS代碼中的光標設置

auto(default)默認值。瀏覽器根據當前情況自動確定鼠標光標類型。
col-resize有左右兩個箭頭,中間由豎線分隔開的光標。用於標示項目或標題欄可以被水平改變尺寸。
crosshair簡單的十字線光標。
all-scroll有上下左右四個箭頭,中間有一個圓點的光標。用於標示頁面可以向上下左右任何方向滾動。
move十字箭頭光標。用於標示對象可被移動。
help帶有問號標記的箭頭。用於標示有幫助信息存在。
no-drop帶有一個被斜線貫穿的圓圈的手形光標。用於標示被拖起的對象不允許在光標的當前位置被放下。
not-allowed禁止標記(一個被斜線貫穿的圓圈)光標。用於標示請求的操作不允許被執行。
pointer(hand)豎起一只手指的手形光標。就像通常用戶將光標移到超鏈接上時那樣。
progress帶有沙漏標記的箭頭光標。用於標示一個進程正在后台運行。
row-resize有上下兩個箭頭,中間由橫線分隔開的光標。用於標示項目或標題欄可以被垂直改變尺寸。
text用於標示可編輯的水平文本的光標。通常是大寫字母 I 的形狀。
vertical-text用於標示可編輯的垂直文本的光標。通常是大寫字母 I 旋轉90度的形狀。
wait用於標示程序忙用戶需要等待的光標。通常是沙漏或手表的形狀。
*-resize用於標示對象可被改變尺寸方向的箭頭光標。
w-resize | s-resize | n-resize | e-resize | ne-resize | sw-resize | se-resize | nw-resize


免責聲明!

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



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