一、 表單指令
1. v-model = "變量"
v-model
可以實現數據的雙向綁定(即其變量所在的任何位置,只要變量的值改變,所有該變量的值都同時修改更新)
(1)普通input框
- 變量值就是
value
的值
(2)單選input框
- 變量值為多個單選框中,某一個value值
(3)單一復選input框
- 變量值為布爾,代表是否選中
(4)多復選input框
- 變量為數組,存放選中的選項的value
2. 實例
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title>表單指令</title>
</head>
<body>
<div id="app">
<!--表單指令: v-model="變量" 變量值與表單標簽的value相關
v-model可以實現數據的雙向綁定:v-model綁定的變量值可以影響表單標簽的值,反過來單標簽的值也可以影響變量的值
-->
<form action="">
<!--重點-->
<input type="text" name="usr" id="usr" placeholder="請輸入賬號" v-model="v1">
<input type="text" v-model="v1">
{{ v1 }}
<hr>
<!--1.單選框-->
男:<input type="radio" name="sex" value="male" v-model="v2">
女:<input type="radio" name="sex" value="female" v-model="v2">
{{ 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 }}
<hr>
<button type="submit">提交</button>
</form>
</div>
</body>
<script src="js/vue.js"></script>
<script>
new Vue({
el: '#app',
data: {
v1: '123',
v2: 'male',
v3: false,
v4: ['male', 'female']
}
})
</script>
</html>
二、條件指令
1. v-show="布爾變量"
- 當布爾變量的值為true時,顯示並渲染本標簽
- 當布爾變量的值為false時,在瀏覽器上展示本標簽,但隱藏渲染標簽。(即標簽含有
display:none
樣式)
2. v-if="布爾變量"
-
當布爾變量的值為true時,顯示並渲染本標簽
-
當布爾變量的值為false時,在瀏覽器上的html代碼中沒有本標簽。
3. v-if v-else-if v-else
- 同
v-if="布爾變量"
的用法一致
4. 實例
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title></title>
<style>
[v-cloak] { display: none; }
.box {
width: 200px;
height: 200px;
}
.r {background-color: red}
.b {background-color: blue}
.g {background-color: green}
.active {
background-color: deeppink;
}
</style>
</head>
<body>
<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="{active: page === 'r_page'}">紅</button>
<button @click="page='b_page'" :class="{active: page === 'b_page'}">藍</button>
<button @click="page='g_page'" :class="{active: page === 'g_page'}">綠</button>
</div>
<div class="box r" v-if="page === 'r_page'"></div>
<div class="box b" v-else-if="page === 'b_page'"></div>
<div class="box g" v-else></div>
</div>
</div>
</body>
<script src="js/vue.js"></script>
<script>
new Vue({
el: '#app',
data: {
is_show: false,
page: 'r_page'
}
})
</script>
</html>
三、循環指令
1. v-for="變量 in 可迭代對象"
(1)遍歷字符串或數組
v-for="v in str|arr" <!--v為值-->
v-for="(v, i) in str|arr" <!--v為值,i為索引-->
(2)遍歷對象(字典)
v-for="v in dic" <!--v為值-->
v-for="(v, k) in dic" <!--v為字典的value,k為字典的key-->
v-for="(v, k, i) in dic" <!--v為字典的value,k為字典的key,i為key的索引(對字典的key優化過了,所以有索引)-->
2. 實例
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title>循環指令</title>
</head>
<body>
<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="(c, i) in info">{{i}}:{{c}}<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 v-for="tea in teas">
<span v-for="(v, k, i) in tea"><span v-if="i !== 0"> | </span>{{ k }}:{{ v }}</span>
</div>
</div>
</body>
<script src="js/vue.js"></script>
<script>
new Vue({
el: '#app',
data: {
info: 'good good study',
stus: ['Bob', 'Tom', 'Jerry'],
people: {
name: '猴子',
age: 36.7,
sex: '女',
},
teas: [
{
name: 'jason',
age: 73,
sex: '男',
},
{
name: 'egon',
age: 74,
sex: '男',
},
{
name: 'owen',
age: 17.5,
sex: '男',
}
]
}
})
</script>
</html>
四、前端數據庫
- 前端瀏覽器都自帶數據庫,下面介紹兩個前端的數據庫
1. localStorage
- 永久存儲
(1)字符串的存取
// 存
localStorage.變量名 = 變量值;
// 取
localStorage.變量名
(2)數組等其他類型數據的存取
- 數組等類型需要先序列化成
JSON
// 存
localStorage.數組名 = JSON.stringify(數組值);
// 取
JSON.parse(localStorage.數組名)
// 清空數據庫
localStorage.clear();
2. sessionStorage
- 臨時存儲(標簽所屬頁面被關閉后,清空數據庫)
(1)字符串的存取
// 存
sessionStorage.變量名 = 變量值;
// 取
sessionStorage.變量名
(2)數組等其他類型數據的存取
- 數組等類型需要先序列化成
JSON
// 存
sessionStorage.數組名 = JSON.stringify(數組值);
// 取
JSON.parse(sessionStorage.數組名)
// 清空數據庫
sessionStorage.clear();
3. for循環的案例
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title>todo list 案例</title>
<style>
li:hover {
color: red;
cursor: pointer;
}
</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="js/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>
</html>
五、分隔符
- 分隔符就是當
vue
的插值語法即{{ }}
與其他的框架的語法相沖突時,我們可以通過分隔符來修改vue
的插值語法。 delimiters: ['[{', '}]'], // 修改插值表達式符號,將原來的 {{ }} 修改成 [{ }]
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<div id="app">
{{ msg }}
[{ msg }]
</div>
</body>
<script src="js/vue.js"></script>
<script>
new Vue({
el: '#app',
data: {
msg: 'message'
},
delimiters: ['[{', '}]'], // 修改插值表達式符號,將原來的 {{ }} 修改成 [{ }]
})
</script>
</html>
六、過濾器
-
vue
的過濾器都需要自己定義,但其自定義過濾器的方法非常簡單 -
自定義過濾器方法
''' 1、在filters成員中定義過濾器方法 2、可以對多個值進行過濾,過濾時還可以額外傳入輔助參數 3、過濾的結果可以再進行下一次過濾(過濾的串聯) 語法: {{ n1, n2 | f1(30) | f2 }} filters: { f1(n1,n2,n3) {return 過濾結果}, f2(f1的res) {return 過濾結果}, } '''
-
實例
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <title>過濾器</title> </head> <body> <div id="app"> <!-- 總結: 1、在filters成員中定義過濾器方法 2、可以對多個值進行過濾,過濾時還可以額外傳入輔助參數 3、過濾的結果可以再進行下一次過濾(過濾的串聯) --> <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; }, f2 (a, b, c, d) { console.log(a, b, c, d); return a + b + c + d; }, f3 (num) { return num * num; } } }) </script> </html>
七、計算屬性
- 用法和注意
'''
1、computed計算屬性可以聲明 方法屬性(方法屬性一定不能在data中重復聲明)
2、方法屬性 必須在頁面中渲染,才會啟用綁定的方法,方法屬性的值就是綁定方法的返回值
3、綁定的方法中出現的所有變量都會被監聽,任何一個變量的值變化、更新都會重新觸發綁定方法,從而更新方法屬性的返回值
一般用來解決的問題:一個變量值依賴於多個變量
'''
- 實例
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<div id="app">
<input type="number" min="0" max="100" v-model="n1">
<input type="number" min="0" max="100" v-model="n2">
<!--必須在頁面上渲染-->
<button>{{ result }}</button>
</div>
</body>
<script src="js/vue.js"></script>
<script>
new Vue({
el: '#app',
data: {
n1: '',
n2: '',
// result: 0, // 不能在data中重復聲明
},
computed: {
result () {
console.log('被調用了');
n1 = +this.n1;
n2 = +this.n2;
return n1 + n2;
}
}
})
</script>
</html>
八、監聽屬性
- 使用和注意
'''
1、監聽的屬性需要在data中聲明,監聽方法不需要返回值
2、監聽的方法名就是監聽的屬性名,該屬性值發生更新時就會回調監聽方法
3、監聽方法有兩個回調參數:當前值,上一次值
解決的問題:多個變量值依賴於一個變量值
'''
- 實例
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<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="js/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>
</html>
九、冒泡排序
- 公式
// 按照分數進行排名
for (let i=0; i<可迭代對象.length-1; i++) {
for (let j=0; j<可迭代對象.length-1-i; j++) {
// 處理條件即可
if ( a>b ) { // 排序方式
// 交叉賦值,互換位置
a,b = b,a
}
}
}
- 實例
// 對數組排序
let arr = [3, 2, 5, 4, 1];
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;
}
}
}
// 對字典排序
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;
}
}
}