Vue的computed計(jì)算屬性你了解嗎
computed計(jì)算屬性
1、什么是計(jì)算屬性
計(jì)算屬性 本質(zhì)是方法,只是在使用這些 計(jì)算屬性 的時(shí)候,把他們的名稱直接當(dāng)作 屬性 來(lái)使用,并不會(huì)把 計(jì)算屬性 當(dāng)作方法去調(diào)用,不需要加小括號(hào) ()調(diào)用。
2、為什么要用計(jì)算屬性
當(dāng)你需要一個(gè)屬性是需要經(jīng)過(guò)一些計(jì)算的,比如你要一個(gè)discounted折扣后的錢(qián)屬性,現(xiàn)在有price價(jià)格,和discount折扣。那么discounted=price*discount
。discounted與現(xiàn)有的屬性price和discount相關(guān)聯(lián)。
要得出discounted的值,我們可以這樣寫(xiě)。
<div>{{price*discount}}</div>
我們不是要 discounted屬性嗎,這樣寫(xiě)貌似不需要添加一個(gè)屬性,直接用表達(dá)計(jì)算出折扣后的值就行了。
那么,如果非要得到個(gè)discounted呢,我們可能會(huì)想到用methods寫(xiě)個(gè)方法進(jìn)行計(jì)算
<!--template--> <div class="price"> 原價(jià):<span v-text="price"></span><br> 現(xiàn)價(jià): <span v-text="discounted()"></span> </div> <!--script--> data() { return { price:100, discount:0.8 } }, methods: { discounted(){ this.price*discount } },
再看看vue的comunidad計(jì)算屬性
<!--template--> <div class="price"> 原價(jià):<span v-text="price"></span><br> 現(xiàn)價(jià): <span v-text="discounted"></span> </div> <!--script--> computed: { discounted(){ return this.price*this.discount } },
我們又會(huì)想,用表達(dá)式price*discount
不就可以得出discounted嗎,為什么還要費(fèi)那么大功夫?qū)懯裁捶椒?,computed。
那么問(wèn)題就來(lái)了,如果我們的discounted是根據(jù)你買(mǎi)的金額,按一下規(guī)則來(lái):
原價(jià)x | 折扣 |
---|---|
0<x<=50 | 0.9 |
50<x<=100 | 0.85 |
100<x | 0.8 |
那么我們?cè)撊绾螌?shí)現(xiàn)呢?我們先試著直接用表達(dá)式看看。
這里報(bào)錯(cuò)了,顯然不支持多行表達(dá)式。如果需要經(jīng)過(guò)一些稍微復(fù)雜的計(jì)算,我們就必須使用函數(shù)了。
但是,還是建議即使是簡(jiǎn)單的表達(dá)式,還是建議寫(xiě)成computed或者computed里
因?yàn)槲覀儗?xiě)程序要有關(guān)注分離的思想,比如css就寫(xiě)在< style >里,js就寫(xiě)在< script >里,這樣更方便我們閱讀,也使代碼更加規(guī)范。
那么,又有問(wèn)題來(lái)了,這里我們的確得出了想要的值,但我們發(fā)現(xiàn)用methods不就行了嗎,為啥還要computed呢,這兩者有什么區(qū)別?
- 1、methods使用時(shí),一般情況需要加括號(hào),而computed則不需要。
- 2、methods每次調(diào)用時(shí)會(huì)重新執(zhí)行函數(shù),而computed在其內(nèi)部變量不變或其返回值不變的情況下多次調(diào)用只會(huì)執(zhí)行一次,后續(xù)執(zhí)行時(shí)直接從緩存中獲取該computed的結(jié)果。
至于為什么computed為什么不像methods一樣使用小括號(hào)調(diào)用,是由于computed本身就是一個(gè)屬性,其本質(zhì)是computed內(nèi)部有兩個(gè)方法(set和get),computed最終的道德的結(jié)果是get方法的返回值,而set方法很少使用到,因此簡(jiǎn)化寫(xiě)法就是上述正常使用computed的格式。
3、compute、methods和watch三者的區(qū)別
computed | methods | watch | |
---|---|---|---|
緩存 | 有 | 沒(méi)有 | 沒(méi)有 |
異步 | 不行 | 不行 | 行 |
觸發(fā) | 模板使用:數(shù)據(jù) | 模板使用:方法 | 被監(jiān)控?cái)?shù)據(jù)發(fā)送變動(dòng) |
靈活度 | 最低 | 高 | 最高 |
推薦度 | 最高 | 其次 | 最低(依賴關(guān)系容易變得復(fù)雜) |
4、案例:遍歷數(shù)組對(duì)象的時(shí)候進(jìn)行監(jiān)視
那么我們一般對(duì)數(shù)組監(jiān)視,在遍歷的時(shí)候?qū)Ξ?dāng)前數(shù)組的對(duì)象進(jìn)行監(jiān)視,我們?cè)撛趺醋瞿亍?/p>
computed也是也可以傳參的,我們要檢測(cè)哪個(gè)對(duì)象,把當(dāng)前對(duì)象傳入就可以了,這樣檢測(cè)的數(shù)據(jù)就是動(dòng)態(tài)的。
我直接用昨天玩css寫(xiě)的例子吧。這里只需要關(guān)注價(jià)格,其他可以忽略,我也懶得改了,哈哈。
<template> <div class="container"> <div class="list" v-for="item in list" :key="item" > <div class="list-item"> <img :src="item.url" alt="" > <div class="item-select"> <!-- <div style="width:120px;float:left;"> <button>喜歡</button> </div> <div style="width:120px;float:left;"> <button>不喜歡</button> </div> --> <svg v-show="!item.like" @click="liked(item)" t="1647706494573" class="icon" viewBox="0 0 1025 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5953" width="200" height="200"><path d="M935.669676 115.583774C871.255802 51.1699 792.995954 24.681952 709.318118 37.925926c-66.219871 10.23398-133.643739 45.751911-196.853616 102.3398C448.652627 83.677837 381.228759 48.159906 315.008888 37.925926 231.331051 24.681952 153.071204 51.1699 88.65733 115.583774 23.641457 180.599647-7.060483 266.08348 1.367501 355.781305c9.029982 89.095826 55.383892 178.191652 134.245738 257.053498 12.039976 12.039976 55.985891 55.985891 100.533804 100.533804l0 0c53.577895 54.179894 108.359788 108.961787 109.563786 110.165785 0.601999 0.601999 1.203998 0.601999 1.805996 1.203998L511.862503 989.084068l48.761905-48.159906 4.815991-4.213992c9.029982 0 265.481481-267.287478 322.069371-324.477366 78.861846-78.861846 125.215755-167.957672 134.245738-257.053498C1031.387489 266.08348 1000.685549 180.599647 935.669676 115.583774zM147.653215 322.67137c-6.019988 18.059965-9.631981 34.915932-10.835979 47.557907-1.805996 13.845973-13.243974 24.079953-27.089947 24.079953l-1.805996 0c-16.855967 0-30.099941-15.651969-27.089947-32.507937 3.611993-21.069959 9.029982-40.333921 15.049971-57.791887 6.019988-16.253968 25.283951-22.875955 40.333921-14.447972 0 0 0.601999 0 0.601999 0C147.051216 296.183422 151.867207 310.029394 147.653215 322.67137zM364.372792 140.867725c0 13.243974-9.029982 24.681952-22.273956 27.089947-79.463845 13.243974-127.623751 48.159906-158.325691 86.687831-8.427984 10.835979-24.079953 13.845973-36.119929 6.621987 0 0-0.601999 0-0.601999 0-13.845973-8.427984-16.855967-27.691946-7.223986-40.93592 60.199882-78.861846 146.285714-103.543798 192.639624-110.767784 16.855967-2.407995 31.303939 10.23398 31.303939 27.089947L363.770793 140.867725z" p-id="5954" fill="#bfbfbf"></path></svg> <svg v-show="item.like" @click="liked(item)" t="1647706494573" class="icon" viewBox="0 0 1025 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5953" width="200" height="200"><path d="M935.669676 115.583774C871.255802 51.1699 792.995954 24.681952 709.318118 37.925926c-66.219871 10.23398-133.643739 45.751911-196.853616 102.3398C448.652627 83.677837 381.228759 48.159906 315.008888 37.925926 231.331051 24.681952 153.071204 51.1699 88.65733 115.583774 23.641457 180.599647-7.060483 266.08348 1.367501 355.781305c9.029982 89.095826 55.383892 178.191652 134.245738 257.053498 12.039976 12.039976 55.985891 55.985891 100.533804 100.533804l0 0c53.577895 54.179894 108.359788 108.961787 109.563786 110.165785 0.601999 0.601999 1.203998 0.601999 1.805996 1.203998L511.862503 989.084068l48.761905-48.159906 4.815991-4.213992c9.029982 0 265.481481-267.287478 322.069371-324.477366 78.861846-78.861846 125.215755-167.957672 134.245738-257.053498C1031.387489 266.08348 1000.685549 180.599647 935.669676 115.583774zM147.653215 322.67137c-6.019988 18.059965-9.631981 34.915932-10.835979 47.557907-1.805996 13.845973-13.243974 24.079953-27.089947 24.079953l-1.805996 0c-16.855967 0-30.099941-15.651969-27.089947-32.507937 3.611993-21.069959 9.029982-40.333921 15.049971-57.791887 6.019988-16.253968 25.283951-22.875955 40.333921-14.447972 0 0 0.601999 0 0.601999 0C147.051216 296.183422 151.867207 310.029394 147.653215 322.67137zM364.372792 140.867725c0 13.243974-9.029982 24.681952-22.273956 27.089947-79.463845 13.243974-127.623751 48.159906-158.325691 86.687831-8.427984 10.835979-24.079953 13.845973-36.119929 6.621987 0 0-0.601999 0-0.601999 0-13.845973-8.427984-16.855967-27.691946-7.223986-40.93592 60.199882-78.861846 146.285714-103.543798 192.639624-110.767784 16.855967-2.407995 31.303939 10.23398 31.303939 27.089947L363.770793 140.867725z" p-id="5954" fill="#d4237a"></path></svg> </div> <div class="price"> 原價(jià):<span v-text="item.price"></span> 現(xiàn)價(jià): <span v-text="discounted(item)"></span> (點(diǎn)亮中間的愛(ài)心再減5元!) </div> </div> </div> </div> </template> <script> export default { name: "Child", data() { return { list: [ { price:88.88, like: false, url: "https://tse4-mm.cn.bing.net/th/id/OIP-C.E5Ce0SanbLrLCq6j5IQXVQHaE7?w=268&h=180&c=7&r=0&o=5&dpr=1.12&pid=1.7", }, { price:100, like: false, url: "https://img.zcool.cn/community/0146eb57d154f40000018c1b84142e.jpg@1280w_1l_2o_100sh.jpg", }, { price:20.56, like: false, url: "https://img.zcool.cn/community/01e89b5ddfb3c7a80120686b029383.jpg@2o.jpg", }, { price:100.50, like: false, url: "https://img.zcool.cn/community/0159bc5767a2600000018c1b76f216.jpg@1280w_1l_2o_100sh.jpg", }, { price:666.00, like: false, url: "https://img.zcool.cn/community/0132e85e0abc74a8012165180d2178.jpg@1280w_1l_2o_100sh.jpg", }, ], price:100, discount:0.8 } }, computed: { discounted(){ return function(item){ //對(duì)價(jià)格進(jìn)行條件計(jì)算 let price = item.price if(0<price&&price<=50){ price = price*0.9 }else if(50<price&&price<=100){ price = price*0.85 }else if(100<price){ price = price*0.8 } if(item.like){ price -= 5 } //返回兩位小數(shù) return price.toFixed(2) } }, }, methods: { liked(item){ item.like = !item.like } }, }; </script> <style> body { background-image: linear-gradient(to top, #c4c5c7 0%, #dcdddf 52%, #ebebeb 100%); } .container { margin: 0 auto; width: 400px; /* border: 1px solid black ; */ } .list-item { margin-top: 40px; } p { margin: 10px 40%; } .list-item img { width: 100%; height: 300px; border-radius: 20px; box-shadow: 5px 10px 13px 3px rgba(110, 115, 127, 0.5); opacity: 0.8; transition: 0.8s; } .list-item img:hover { opacity: 1; } .item-select { width: 100%; height: 80px; position: relative; } /* .item-select button { color: white; font-weight: bold; font-family: 幼圓; margin-top: 20px; width: 100px; height: 55px; margin-left: 90px; background-image: linear-gradient(to top, #a3bded 0%, #6991c7 100%); padding: 15px; display: inline; font-size: 18px; text-align: center; border-radius: 10px; transition: 0.5s; white-space: nowrap; border: 1px #dee7ec solid; opacity: 0.8; } button:hover { background-image: linear-gradient(to right, #ff758c 0%, #ff7eb3 100%); color: white; width: 105px; height: 60px; } */ .list-item svg{ width: 60px; height: 60px; margin: 20px 170px; position:absolute; left: 0; top: 0; transition: 0.3s; } .list-item svg:hover{ width: 65px; height: 65px; transition: 0.1s; } </style>
我們來(lái)看看是否監(jiān)視成功
加個(gè)點(diǎn)亮愛(ài)心再減5元的功能
添加個(gè)liked方法,點(diǎn)擊了就將當(dāng)前對(duì)象的like取反
在計(jì)算屬性中再添加一個(gè)條件,當(dāng)點(diǎn)亮了愛(ài)心,也就是like=true,就再減5元
如果點(diǎn)亮愛(ài)心,現(xiàn)價(jià)可以再減5元,取消點(diǎn)亮,恢復(fù)原來(lái)的價(jià)格,說(shuō)明監(jiān)視成功。
來(lái)看看效果吧
當(dāng)取消點(diǎn)亮,價(jià)格又會(huì)恢復(fù)。
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
vue.js與element-ui實(shí)現(xiàn)菜單樹(shù)形結(jié)構(gòu)的解決方法
本文通過(guò)實(shí)例給大家介紹了vue.js與element-ui實(shí)現(xiàn)菜單樹(shù)形結(jié)構(gòu),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2018-04-04vue 獲取視頻時(shí)長(zhǎng)的實(shí)例代碼
這篇文章主要介紹了vue 獲取視頻時(shí)長(zhǎng)的實(shí)例代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08el-tree?loadNode懶加載的實(shí)現(xiàn)
本文主要介紹了el-tree?loadNode懶加載的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08詳解Vue 2中的? initState 狀態(tài)初始化
這篇文章主要介紹了詳解Vue 2中的initState狀態(tài)初始化,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-08-08VUE+Element UI實(shí)現(xiàn)簡(jiǎn)單的表格行內(nèi)編輯效果的示例的代碼
這篇文章主要介紹了VUE+Element UI實(shí)現(xiàn)簡(jiǎn)單的表格行內(nèi)編輯效果的示例的代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-10-10vue模塊導(dǎo)入報(bào)錯(cuò)問(wèn)題Module not found: Error:[CaseSensi
這篇文章主要介紹了vue模塊導(dǎo)入報(bào)錯(cuò)問(wèn)題Module not found: Error:[CaseSensitivePathsPlugin],具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06