
批改狀態(tài):合格
老師批語(yǔ):
條件渲染指令v-if
,v-show
。
v-if
指令: v-if 指令和原生 js 中的 if 語(yǔ)句的功能是一樣的,作為條件約束,執(zhí)行哪些功能。同樣有作為單分支和多分支條件的語(yǔ)句。v-show
指令: v-show 指令和 v-if 指令的功能差不多,區(qū)別最大的一點(diǎn)是使用 v-dom 的元素,在 dom 樹(shù)加載完成之后就會(huì)存在,只是顯示不顯示的問(wèn)題,而 v-if 語(yǔ)句則不一樣,它是根據(jù)條件判斷,然后再?gòu)?vue 中渲染到頁(yè)面上。v-show 的用處是可以定時(shí)的顯示一些準(zhǔn)備好的東西。好處是比起 v-if 來(lái)說(shuō),v-show 是本來(lái)就存在的 dom 元素,頁(yè)面不會(huì)進(jìn)行多次的渲染刷新。
實(shí)例演示條件渲染
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<title>條件渲染:v-if,v-show</title>
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.12/dist/vue.js"></script>
</head>
<body>
<div class="app">
<!-- 單分支結(jié)構(gòu) -->
<p v-if="flag">{{msg}}</p>
<button
v-text="tips = flag ? '隱藏' : '顯示'"
@click="flag = !flag"
></button>
</div>
<script>
// v-if:決定元素是否添加到頁(yè)面上
// v-show:元素是否顯示出來(lái)(元素已經(jīng)在dom結(jié)構(gòu)中了)
const vm = new Vue({
el: ".app",
data() {
return {
msg: "當(dāng)flag為true的時(shí)候我會(huì)顯示出來(lái)",
flag: true,
};
},
});
</script>
</body>
</html>
上述示例演示的是一個(gè)簡(jiǎn)單的由 v-if 指令完成的單分支的條件渲染,默認(rèn)設(shè)置的是 flag=true, 可以看到的是 vue 的掛載點(diǎn)中的<p v-if="flag">{{msg}}</p>
,作用是判斷 flag 的值,然后選擇要不要進(jìn)行渲染,底下的 button 中的點(diǎn)擊事件,給了一個(gè)可以改變 flag 的操作。
效果如下
在 html 文檔中的顯示是這樣的
點(diǎn)擊之前 dom 結(jié)構(gòu)
點(diǎn)擊之后 dom 結(jié)構(gòu)
可以清楚的看到頁(yè)面中的 dom 變化,所以每一次的 v-if 渲染都是對(duì)頁(yè)面的一次刷新。
使用 v-show 來(lái)對(duì)頁(yè)面進(jìn)行渲染
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>條件渲染:v-if,v-show</title>
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.12/dist/vue.js"></script>
</head>
<body>
<div class="app">
<!-- v-show操作 -->
<p v-show="status">提前祝大家新年快樂(lè)!</p>
<!-- v-show操作的用處:可以定時(shí)的顯示一些準(zhǔn)備好的東西,比起v-if來(lái)說(shuō),v-show是本來(lái)就存在的dom元素,頁(yè)面不會(huì)進(jìn)行多次的渲染刷新 -->
</div>
<script>
// v-if:決定元素是否添加到頁(yè)面上
// v-show:元素是否顯示出來(lái)(元素已經(jīng)在dom結(jié)構(gòu)中了)
const vm = new Vue({
el: ".app",
data() {
return {
status: false,
};
},
});
</script>
</body>
</html>
可以看到的是當(dāng)前我設(shè)置的是 false 狀態(tài),所以在頁(yè)面中是不顯示的可以看下執(zhí)行結(jié)果和 dom 結(jié)構(gòu)
然后再將 status 置為 true 狀態(tài),vm.$data.status = true;
可以看到的是,v-show 是在 dom 元素創(chuàng)建之后就存在了,只是顯示不顯示的決定在你,你可以設(shè)置什么時(shí)候顯示,這樣在一些活動(dòng)倒計(jì)時(shí)的情況中,就直接可以更換頁(yè)面,而不顯得突兀,也不需要頁(yè)面刷新。
不過(guò) v-if 的條件渲染功能更加強(qiáng)大,v-show 則是實(shí)時(shí)性更加的好。
使用條件渲染完成 todolist
todolist,就是一個(gè)簡(jiǎn)單的留言功能
使用 vue 實(shí)現(xiàn)時(shí),可以使用很多的事件修飾符和按鍵修飾符,可以省很多事
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>todolist</title>
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.12/dist/vue.js"></script>
</head>
<body>
<div class="app">
<input type="text" name="" @keyup.enter="show($event)" />
<ul v-if="list.length">
<li v-for="(item, index) in list" :key="index" v-text="item"></li>
</ul>
</div>
<script>
// vue實(shí)現(xiàn)
const vm = new Vue({
el: ".app",
data() {
return {
list: [],
};
},
methods: {
show(ev) {
// console.log(ev.target.value);
if (ev.target.value.trim().length === 0) {
alert("輸入內(nèi)容不能為空!");
} else {
this.list.unshift(ev.target.value);
ev.target.value = null;
}
},
},
});
// 原生實(shí)現(xiàn)
// // 獲取事件
// const input = document.querySelector('input[type="text"]');
// const ul = document.querySelector("ul");
// // 為input添加事件
// input.onkeyup = (ev) => {
// // 查看鍵盤(pán)輸入
// // console.log(ev.key);
// if (ev.key === "Enter") {
// // 去掉輸入字符串兩端的空格,然后判斷字符串長(zhǎng)度是否為0
// if (input.value.trim().length === 0) {
// alert("內(nèi)容不能為空!");
// } else {
// let str = `<li>${input.value}</li>`;
// ul.insertAdjacentHTML("afterbegin", str);
// input.value = null;
// }
// }
// };
</script>
</body>
</html>
在上邊的示例中使用了按鍵修飾符.enter,將它添加在事件的后邊,則等同于原生中的if (ev.key === "Enter")
條件判斷語(yǔ)句
計(jì)算屬性使用 computed 聲明,本質(zhì)上就是訪問(wèn)器屬性,最終會(huì)和 data 合并,所以不要和 data 中已有屬性重名。
示例
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<title>計(jì)算屬性</title>
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.12/dist/vue.js"></script>
</head>
<body>
<div class="app">
<p>
數(shù)量:<input type="number" v-model="num" style="width: 5em" min="0" />
</p>
<p>單價(jià):{{price}} 元</p>
<p>金額:{{amount}} 元</p>
</div>
<script>
const vm = new Vue({
el: ".app",
data() {
return {
num: 0,
price: 50,
res: 0,
};
},
// 計(jì)算屬性,使用computed聲明
computed: {
// amount() {
// return this.num * this.price;
// },
// 訪問(wèn)器屬性有g(shù)etter和setter
// 計(jì)算屬性默認(rèn)是getter
amount: {
get() {
return this.num * this.price;
},
set(value) {
console.log(value);
},
},
},
});
vm.amount = 1100;
</script>
</body>
</html>
偵聽(tīng)器屬性使用 watch 聲明,它偵聽(tīng)的是某一個(gè)屬性的值的變化,它的屬性名與 data 中要監(jiān)聽(tīng)的屬性同名。偵聽(tīng)器屬性更加注重的是實(shí)時(shí)性,但是它沒(méi)有計(jì)算屬性靈活.
比如還是上邊計(jì)算屬性的例子,使用偵聽(tīng)器屬性實(shí)現(xiàn)
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>計(jì)算屬性</title>
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.12/dist/vue.js"></script>
</head>
<body>
<div class="app">
<!-- <p>
數(shù)量:
<input
type="number"
v-model="num"
style="width: 5em"
min="0"
@change="calc"
/>
</p>
<p>單價(jià):{{price}} 元</p>
<p>金額:{{res}} 元</p> -->
<p>
數(shù)量:<input type="number" v-model="num" style="width: 5em" min="0" />
</p>
<p>單價(jià):{{price}} 元</p>
<!-- 計(jì)算屬性,本質(zhì)上就是訪問(wèn)器屬性 -->
<p>金額:{{res}} 元</p>
</div>
<script>
const vm = new Vue({
el: ".app",
data() {
return {
num: 0,
price: 50,
res: 0,
};
},
// 偵聽(tīng)器屬性,使用watch聲明
watch: {
// 偵聽(tīng)num屬性的變化,num中的參數(shù)分別是變化的值,變化前的值
num(newValue, oldValue) {
// console.log(newValue, oldValue);
this.res = newValue * this.price;
},
},
});
</script>
</body>
</html>
使用偵聽(tīng)器也同樣可以完成相同的功能
計(jì)算屬性是重新生成一個(gè)屬性,相當(dāng)于原生 js 中的訪問(wèn)器屬性,只是訪問(wèn)和修改是和屬性一樣的方式,本質(zhì)上還是一個(gè)方法。對(duì)于任何復(fù)雜邏輯,都應(yīng)當(dāng)使用計(jì)算屬性去聲明。偵聽(tīng)器屬性的目的是觀察和響應(yīng) Vue 實(shí)例上的數(shù)據(jù)變動(dòng),當(dāng)需要在數(shù)據(jù)變化時(shí)執(zhí)行異步或開(kāi)銷較大的操作時(shí),這個(gè)方式是最有用的。
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號(hào)
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號(hào)