vue computed計(jì)算屬性顯示undefined的解決
vue computed計(jì)算屬性顯示undefined
在做三級(jí)聯(lián)動(dòng)菜單頁(yè)面的時(shí)候,之前的幾個(gè)報(bào)錯(cuò)都解決了,終于沒有報(bào)錯(cuò)了,控制臺(tái)干干凈凈,最后菜單卻沒顯示出來(lái),用vue開發(fā)者工具一看,三級(jí)聯(lián)動(dòng)的模塊里,計(jì)算屬性顯示undefined。
在計(jì)算屬性里console了一下,數(shù)組什么的都能在控制臺(tái)輸出,發(fā)現(xiàn)數(shù)據(jù)明明是傳過(guò)來(lái)了的,
尷尬,原來(lái)是搞各種bug,console來(lái)console去的把計(jì)算屬性的return整沒了。
computed:{ ...mapState({ categoryList:(state)=>{ // console.log(state.home.categoryList) state.home.categoryList } }) }
加上return就恢復(fù)了。
computed:{ ...mapState({ //state的括號(hào)可以去掉,函數(shù)的大括號(hào)可以去掉 categoryList:(state)=>{ // console.log(state.home.categoryList); return state.home.categoryList; } }) }
nice,我是傘兵。
vue computed 使用避坑
其實(shí)不是 computed 的坑,是我自己沒弄清原理瞎用,導(dǎo)致出現(xiàn)各種問題。。
<template> <section> <input type="button" value="查看三個(gè)list的值" @click="lookOneLook" /> <div> list1: <span v-for="(o, index) in list1" :key="'list1' + index"> {{ o }} </span> </div> <div> list2: <span v-for="(o, index) in list2" :key="'list2' + index"> {{ o }} </span> <input type="button" value="向list2中push" @click="list2.push(5)" /> </div> <div> list3: <span v-for="(o, index) in list3" :key="'list3' + index"> {{ o }} </span> <input type="button" value="向list3中push" @click="list3.push(6)" /> </div> </section> </template>
<script> export default { computed: { list2: { get() { return this.list1; }, set(val) { alert("觸發(fā)list2的setter"); this.list1 = val; }, }, list3: { get() { return this.list1.map((o) => o); }, set(val) { alert("觸發(fā)list3的setter"); this.list1 = val; }, }, }, data() { return { list1: [1, 2, 3, 4], }; }, methods: { lookOneLook() { alert(` list1 : ${this.list1} list2 : ${this.list2} list3 : ${this.list3}`); }, }, }; </script>
list2.push 和 list3.push 都沒有觸發(fā)的 computed setter。對(duì)于引用類型的計(jì)算屬性,只有 list2=...
這樣修改引用地址,才會(huì)觸發(fā) setter
list2.push()
:能成功修改三個(gè)list的值。因?yàn)?list2 和 list1 是相同的引用地址,list2.push 此時(shí)等價(jià)于 list1.push。list1變化后觸發(fā)list3變化list3.push()
:能成功修改自己,但是數(shù)據(jù)變化沒有觸發(fā)視圖的自動(dòng)更新。是因?yàn)?computed 只是個(gè) Watcher,自身沒有綁定依賴,值變化不會(huì)觸發(fā)視圖的更新。所以在頁(yè)面中看不到 list3 變化,只能在彈窗中看到 list3 的變化(因?yàn)閺棿笆敲看吸c(diǎn)擊后當(dāng)場(chǎng)取值的)- 又
list2.push
:此時(shí)list3 又變回去了
反思
對(duì)于引用類型的計(jì)算屬性,只有 list2=… 這樣修改引用地址,才會(huì)觸發(fā) setter
計(jì)算屬性自己只是個(gè) Watcher,不是像 props 和 data 那樣的數(shù)據(jù)。所以絕對(duì)不要在計(jì)算屬性上加自定義的屬性,因?yàn)闆]有意義:
1. 它不是對(duì)象,沒有依賴關(guān)系。數(shù)據(jù)變化,"依賴"不會(huì)更新
2. computed 內(nèi)部關(guān)聯(lián)的變量一旦變化,computed 的值就會(huì)重新計(jì)算,你自己添加的屬性的修改就都沒了。
下面的寫法一有效,是因?yàn)橐孟嗤?,相?dāng)于什么都沒干就是單純起了個(gè)別名。這種起別名的操作以后少干,因?yàn)檫壿嬌虾懿磺逦瑥?fù)雜的工程中出了 bug 不好調(diào)。
computed:{ options:{ // 寫法一:test() 有效,是因?yàn)?this.options 和 this.userObj.options 是相同引用 return this.userObj.options; /** 寫法二:test() 無(wú)效 return { name :this.userObj.options.name };*/ } } methods:{ test(){ this.options.name='1'; } }```
computed 本質(zhì)就是一個(gè)有 value 的 Watcher,別把它當(dāng)數(shù)據(jù)用?。?!
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue3使用ref獲取dom結(jié)果為'null'的原因詳析
這篇文章主要給大家介紹了關(guān)于vue3使用ref獲取dom結(jié)果為'null'的原因詳析,ref是Vue3中一個(gè)非常重要的功能,它可以用來(lái)獲取DOM節(jié)點(diǎn),從而實(shí)現(xiàn)對(duì)DOM節(jié)點(diǎn)的操作,需要的朋友可以參考下2023-07-07Vue3實(shí)現(xiàn)一個(gè)定高的虛擬列表
虛擬列表對(duì)于大部分一線開發(fā)同學(xué)來(lái)說(shuō)是一點(diǎn)都不陌生的東西了,這篇文章主要來(lái)教大家如何在2分鐘內(nèi)實(shí)現(xiàn)一個(gè)定高的虛擬列表,感興趣的可以了解下2024-12-12vue項(xiàng)目中vue-i18n和element-ui國(guó)際化開發(fā)實(shí)現(xiàn)過(guò)程
這篇文章主要介紹了vue項(xiàng)目中vue-i18n和element-ui國(guó)際化開發(fā)實(shí)現(xiàn)過(guò)程,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2018-04-04基于Vue3實(shí)現(xiàn)旋轉(zhuǎn)木馬動(dòng)畫效果
這篇文章主要為大家介紹了如何利用Vue3實(shí)現(xiàn)旋轉(zhuǎn)木馬的動(dòng)畫效果,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Vue有一定的幫助,需要的可以參考一下2022-05-05element-ui 表格實(shí)現(xiàn)單元格可編輯的示例
下面小編就為大家分享一篇element-ui 表格實(shí)現(xiàn)單元格可編輯的示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-02-02vue實(shí)現(xiàn)路由監(jiān)聽和參數(shù)監(jiān)聽
今天小編就為大家分享一篇vue實(shí)現(xiàn)路由監(jiān)聽和參數(shù)監(jiān)聽,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-10-10優(yōu)雅的處理vue項(xiàng)目異常實(shí)戰(zhàn)記錄
這篇文章主要給大家介紹了關(guān)于如何優(yōu)雅的處理vue項(xiàng)目異常的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用vue具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06