Vue使用Composition?API生成計(jì)算屬性computed
概述
作為程序員我們都知道寫代碼不僅要高效完成需求,還要讓我們的代碼優(yōu)雅、可維護(hù)性更高。而可維護(hù)性即代碼的可讀性,因?yàn)槲覀儗懙拇a就是公司的財(cái)產(chǎn),當(dāng)需要其他人維護(hù)的時(shí)候,可讀性更高的代碼會讓維護(hù)你代碼的人更快上手。本文說的computed計(jì)算屬性就是為了這一目的來的,計(jì)算屬性可以讓我們的代碼看起來不臃腫,可讀性和可維護(hù)性更高,所以在介紹使用Compition Api生成計(jì)算屬性之前,我們需要先介紹下啥是計(jì)算屬性。
1. 計(jì)算屬性
1.1 計(jì)算屬性的介紹和使用
Vue的表達(dá)式很強(qiáng)大也很方便,但是寫簡單的操作還行,復(fù)雜的操作雖然也沒啥大問題,但是會讓代碼變得很臃腫,導(dǎo)致可讀性變得很差,難以維護(hù)。引用官網(wǎng)的例子來了解計(jì)算屬性。
//.........省略開頭代碼.......
data() {
return {
author: {
name: 'John Doe',
books: [
'Vue 2 - Advanced Guide',
'Vue 3 - Basic Guide',
'Vue 4 - The Mystery'
]
}
}
}假設(shè)想根據(jù) author 是否已有一些書籍來展示不同的信息,如果使用表達(dá)式的方式如下:
<p>是否有已經(jīng)發(fā)布的書籍:</p>
<span>{{ author.books.length > 0 ? 'Yes' : 'No' }}</span>上面的代碼看起來已經(jīng)顯示得有點(diǎn)復(fù)雜了,萬一我們需要在界面中的很多地方都這樣寫,就太臃腫了,同樣的代碼到處都在寫。所以引入了計(jì)算屬性來優(yōu)化這個(gè)問題。也許很多小伙伴會說用方法抽取呀,后面會介紹為啥不用方法。 使用計(jì)算屬性后上面的需求可以用如下的方式實(shí)現(xiàn),我們可以使用Vue提供的computed關(guān)鍵字定義計(jì)算屬性:
//.............省略開頭代碼.....
data() {
return {
author: {
name: 'John Doe',
books: [
'Vue 2 - Advanced Guide',
'Vue 3 - Basic Guide',
'Vue 4 - The Mystery'
]
}
}
},
computed: {
// 一個(gè)計(jì)算屬性的 getter
publishedBooksMessage() {
// `this` 指向當(dāng)前組件實(shí)例
return this.author.books.length > 0 ? 'Yes' : 'No'
}
}
// ..........在上面的代碼中,我們在這里定義了一個(gè)計(jì)算屬性 publishedBooksMessage。當(dāng)我們更改此應(yīng)用的 data 中 books 數(shù)組的值后,可以看到 publishedBooksMessage 也會隨之改變。在模板中使用計(jì)算屬性的方式和一般的屬性并無二致。Vue 會檢測到 this.publishedBooksMessage 依賴于 this.author.books,所以當(dāng) this.author.books 改變時(shí),任何依賴于 this.publishedBooksMessage 的綁定都將同時(shí)更新。 (引用自Vue官網(wǎng)計(jì)算屬性章節(jié))
1.2 計(jì)算屬性和方法的區(qū)別
現(xiàn)在我們來解釋下為啥不用方法,Vue反而要提供一個(gè)計(jì)算屬性呢?我們繼續(xù)看例子來解釋。還是用上面的例子,我們同樣可以使用方法來完成需求
// 定義一個(gè)方法來判斷是否有新發(fā)布的作品
methods: {
calculateBooksMessage() {
return this.author.books.length > 0 ? 'Yes' : 'No'
}
}
// 調(diào)用方法
<p>{{ calculateBooksMessage() }}</p>如上面代碼所示,當(dāng)我們使用方法來實(shí)現(xiàn)上面的需求時(shí),執(zhí)行的結(jié)果確實(shí)是完全一致的,不同之處在于計(jì)算屬性值會基于其響應(yīng)式依賴被緩存。一個(gè)計(jì)算屬性僅會在其響應(yīng)式依賴更新時(shí)才重新計(jì)算。這意味著只要 author.books 不改變,無論多少次訪問 ,publishedBooksMessage 都會立即返回先前的計(jì)算結(jié)果,而不用重復(fù)執(zhí)行 getter 函數(shù) 也就是說,計(jì)算屬性會做一個(gè)緩存,只要計(jì)算屬性中參與計(jì)算的變量對應(yīng)的依賴不更新,計(jì)算屬性就會返回緩存的值,有更新才會重新計(jì)算。就比如本例中的books,只要我們不往books中添加新書,那么計(jì)算屬性publishedBooksMessage 會一直返回之前計(jì)算的值,不會觸發(fā)重新計(jì)算,而使用方法的話,每次都會去執(zhí)行方法,無論是否加入新書,都會執(zhí)行。這樣就會浪費(fèi)CPU資源,雖然不多,但是能省則省嘛。
使用計(jì)算屬性的另一個(gè)好處就是快,試想下你有一個(gè)很大的list想要渲染出來,使用方法的話,無論你是否更新list都需要執(zhí)行一遍遍歷拿length的操作,但是使用計(jì)算屬性,計(jì)算過一次后,只要后面沒有更新,就可以使用緩存,這樣就能提升頁面的響應(yīng)速度。
1.3 可寫計(jì)算屬性
計(jì)算屬性默認(rèn)是只讀的。當(dāng)你嘗試修改一個(gè)計(jì)算屬性時(shí),你會收到一個(gè)運(yùn)行時(shí)警告。因?yàn)橛?jì)算屬性主要是會緩存,如果隨意的寫會破壞之前緩存的值,導(dǎo)致下次取出緩存的值時(shí)導(dǎo)致值不是預(yù)期的。通常情況下我們只在某些特殊場景中才需要用到“可寫”的屬性,可寫的計(jì)算屬性可以通過同時(shí)提供 getter 和 setter 來創(chuàng)建,代碼如下:
data() {
return {
firstName: 'John',
lastName: 'Doe'
}
},
computed: {
fullName: {
// getter
get() {
return this.firstName + ' ' + this.lastName
},
// setter
set(newValue) {
// 注意:我們這里使用的是解構(gòu)賦值語法
[this.firstName, this.lastName] = newValue.split(' ')
}
}
}在上面的代碼中當(dāng)調(diào)用this.fullName = 'John Doe' 時(shí),setter 會被調(diào)用而 this.firstName 和 this.lastName 會隨之更新,get()方法是在每次取值時(shí)都會調(diào)用,而set方法是每次賦值時(shí)都會調(diào)用。
2.使用Compition API 生成計(jì)算屬性
在Compition API 中生成計(jì)算屬性其實(shí)就是把傳統(tǒng)Vue中使用的計(jì)算屬性寫到setup函數(shù)中,代碼如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>computed的使用</title>
<script src="https://unpkg.com/vue@next"></script>
</head>
<body>
<div id="root"></div>
</body>
<script>
const app = Vue.createApp({
setup(){
const{ref, computed} = Vue;
const count = ref(0);
const handleClick = ()=>{
count.value += 1;
}
// 操作基本類型的值
// const countAddFive = computed(()=>{
// return count.value + 5;
// });
let countAddFive = computed({
get:() =>{
return count.value + 5;
},
set:(param)=>{
count.value = param - 5;
}
})
setTimeout(()=>{
countAddFive.value = 100;
},3000)
return {count,handleClick,countAddFive}
},
template:
`
<div>
<span @click="handleClick">{{count}}--------{{countAddFive}}</span>
</div>
`
});
const vm = app.mount('#root');
</script>上面的代碼中,我們在setup中使用計(jì)算屬性時(shí)需要事先引入 const{ref, computed} = Vue;然后就是在setup()中使用,用法很簡單,在代碼中已經(jīng) 很清晰了。代碼demo的意思也很簡單,就是展示兩個(gè)值count,和countAddFive,點(diǎn)擊時(shí) 點(diǎn)擊時(shí),count的值加一,countAddFive加5,然后過了3秒后, 將countAddFive的值改成100,然后count的值會變成95,因?yàn)?/p>
set:(param)=>{
count.value = param - 5;
} 設(shè)置conutAddFive的值時(shí)會將count的值減5。
總結(jié)
本文主要介紹了計(jì)算屬性和在Compition API 中使用計(jì)算屬性,學(xué)完本文,我們需要了解到在什么情況下需要使用計(jì)算屬性,計(jì)算屬性和方法的區(qū)別。以及了解可寫的計(jì)算屬性如何使用。計(jì)算屬性的使用可以極大的加快我們的界面響應(yīng)速度,建議讀者好好掌握計(jì)算屬性的使用,然后在項(xiàng)目中根據(jù)場景將計(jì)算屬性應(yīng)用到對應(yīng)的地方。
以上就是Vue使用Composition API生成計(jì)算屬性computed的詳細(xì)內(nèi)容,更多關(guān)于Vue計(jì)算屬性computed的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Vue項(xiàng)目開發(fā)常見問題和解決方案總結(jié)
這篇文章主要介紹了Vue項(xiàng)目開發(fā)常見問題和解決方案總結(jié),幫助大家更好的利用vue開發(fā),感興趣的朋友可以了解下2020-09-09
Vuex 在Vue 組件中獲得Vuex 狀態(tài)state的方法
今天小編就為大家分享一篇Vuex 在Vue 組件中獲得Vuex 狀態(tài)state的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08
VUE組件中的 Drawer 抽屜實(shí)現(xiàn)代碼
這篇文章主要介紹了VUE組件 之 Drawer 抽屜 ,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08
使用vue-touch報(bào)priority錯(cuò)誤的解決
這篇文章主要介紹了使用vue-touch報(bào)priority錯(cuò)誤的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03

