vue組件props屬性監(jiān)聽不到值變化問題
props屬性監(jiān)聽不到值變化問題
在寫項目時遇到一個問題,父組件傳到子組件的prop,在子組件監(jiān)聽不到變化,
遂查看vue文檔,得知watch有一種深度監(jiān)聽的方法。
閱讀vue文檔如下代碼。=》
var vm = new Vue({ ? data: { ? ? a: 1, ? ? b: 2, ? ? c: 3, ? ? d: 4, ? ? e: { ? ? ? f: { ? ? ? ? g: 5 ? ? ? } ? ? } ? }, ? watch: { ? ? a: function (val, oldVal) { ? ? ? console.log('new: %s, old: %s', val, oldVal) ? ? }, ? ? // 方法名 ? ? b: 'someMethod', ? ? // 該回調(diào)會在任何被偵聽的對象的 property 改變時被調(diào)用,不論其被嵌套多深 ? ? c: { ? ? ? handler: function (val, oldVal) { /* ... */ }, ? ? ? deep: true ? ? }, ? ? // 該回調(diào)將會在偵聽開始之后被立即調(diào)用 ? ? d: { ? ? ? handler: 'someMethod', ? ? ? immediate: true ? ? }, ? ? // 你可以傳入回調(diào)數(shù)組,它們會被逐一調(diào)用 ? ? e: [ ? ? ? 'handle1', ? ? ? function handle2 (val, oldVal) { /* ... */ }, ? ? ? { ? ? ? ? handler: function handle3 (val, oldVal) { /* ... */ }, ? ? ? ? /* ... */ ? ? ? } ? ? ], ? ? // watch vm.e.f's value: {g: 5} ? ? 'e.f': function (val, oldVal) { /* ... */ } ? } }) vm.a = 2 // => new: 2, old: 1
這時就可以監(jiān)聽到對象內(nèi)部的屬性變化了。
疑惑,項目中單層的對象,沒有嵌套的對象,居然也監(jiān)聽不到變化。
踩坑的一天。
props監(jiān)聽變化的幾種方式
應(yīng)用場景
在vue中父子組件是通過props傳遞數(shù)據(jù)的。通常有以下幾種場景:
- 子組件展示父組件傳遞過來的props,一般是字符串
- 子組件通過父組件的props計算得到某個值
- 子組件修改父組件傳遞過來的props
1.computed 計算屬性
使用場景:當pros傳遞過來的值不能直接使用的時候,就可以使用計算屬性了。
比如:完整的地址需要將省市區(qū)3個字段拼接后展示。
計算屬性是基于依賴進行緩存的,當props不變時,多次訪問addrese計算屬性,會立即返回結(jié)果,而不必再次執(zhí)行計算。
props: { ? province: String, // 省 ? city: String, // 市 ? area: String // 區(qū) }, computed: { ? address(){ ? ? return `${this.province}${this.city}${this.area}` ? } }
2.methods 方法
上面計算屬性,通過methods也可以實現(xiàn),但methods不會進行緩存,而且methods通常用來處理業(yè)務(wù)邏輯。
3.watch 偵聽器
使用場景:將傳遞過來的props作為初始值,比如城市選擇列表的默認城市,我們希望選擇城市時,改變這個值。
單向數(shù)據(jù)流
父級 prop 的更新會向下流動到子組件中。
當我們需要在子組件中修改父組件傳遞過來的props時,如果直接更改,vue會報錯的,因為如果子組件直接更改父組件的props,會使應(yīng)用的數(shù)據(jù)流向難以理解。
解決方案
為了不直接修改props的值,可以在data中,用props初始化一個data屬性,以后更改這個data屬性即可。
但是這會導(dǎo)致,父組件變化時,該data屬性不會更新(注意:只針對基本類型,如果是引用類型,仍舊是變化的。因為引用類型的內(nèi)存地址沒變)
此時為了更新這個data屬性,就需要使用偵聽器來監(jiān)聽props的變化。
深度監(jiān)聽
使用場景:當監(jiān)聽到某個值變化后,執(zhí)行異步請求。
此時computed和methods都不太合適。
- 基本類型
watch: { ? ?msg(newV,oldV) { ? ? ?// do something ? ? ?console.log(newV,oldV) ? ?}? }
- 引用類型
1.計算屬性(推薦)
先通過計算屬性得到引用類型的內(nèi)部某個字段,再使用偵聽器監(jiān)聽該字段的變化
? props:{ ? ? config:Object ? }, ? computed: { ? ? ? isShow() {? ? ? ? ? ? return this.config.role.isShow ? ? ? } ? }, ? watch: { ? ? ? isShow(newV,oldV) { ? ? ? ? ? // do something ? ? ? ? ? console.log(newV,oldV) ? ? ? } ? }
2.deep
?props:{ ? ? config:Object ? }, ? watch: { ? ? isShow:{ //深度監(jiān)聽,可監(jiān)聽到對象、數(shù)組的變化 ? ? ? ? handler (newV, oldV) { ? ? ? ? ? // do something, 可使用this ? ? ? ? ? console.log(newV,oldV) ? ? ? ? }, ? ? ? ? deep:true ? ? ? ?} ? },
監(jiān)聽對象中的某個值
props:{ ? ? option:Object ? }, ? watch:{ ? ? 'option.text'(newVal,oldVal){ ? ? ? ? ? console.log(newVal,oldVal); ? ? } }
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Vue開發(fā)中出現(xiàn)Loading?Chunk?Failed的問題解決
本文主要介紹了Vue開發(fā)中出現(xiàn)Loading?Chunk?Failed的問題解決,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧2022-03-03vue3超出文本展示el tooltip實現(xiàn)示例
這篇文章主要為大家介紹了vue3超出文本展示el tooltip實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-02-02vue3 Teleport瞬間移動函數(shù)使用方法詳解
這篇文章主要為大家詳細介紹了vue3 Teleport瞬間移動函數(shù)使用方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-03-03vue+element實現(xiàn)動態(tài)換膚的示例代碼
本文主要介紹了vue+element實現(xiàn)動態(tài)換膚的示例代碼,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09