您好,登錄后才能下訂單哦!
本篇內容主要講解“Vue的vue.$set()方法源碼案例詳解”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Vue的vue.$set()方法源碼案例詳解”吧!
在使用vue開發項目的過程中,經常會遇到這樣的問題:當vue的data里邊聲明或者已經賦值過的對象或者數組(數組里邊的值是對象)時,向對象中添加新的屬性,如果更新此屬性的值,是不會更新視圖的。
這是因為新加入的屬性不是響應式的,因此不會觸發視圖的更新,通常使用靜態方法Vue.set()或者實例方法this.$set()解決 ,使用方式:
對象:this.$set(target,key, value)
數組:this.$set(target,index, value)
但不管是靜態方法Vue.set()還是實例方法this.$set(),他們底層的實現邏輯是一樣的,實現邏輯如下:
/** * Set a property on an object. Adds the new property and * triggers change notification if the property doesn't * already exist. */ export function set (target: Array<any> | Object, key: any, val: any): any { // 首先判斷如果傳入的目標對象是undefined, null, primitive(原始值),或拋出警告 if (process.env.NODE_ENV !== 'production' && (isUndef(target) || isPrimitive(target)) ) { warn(`Cannot set reactive property on undefined, null, or primitive value: ${(target: any)}`) } // 判斷目標對象target是數組,并且key是合法的索引 if (Array.isArray(target) && isValidArrayIndex(key)) { // 取目標數組的length值和key中較大的值作為target的length屬性 target.length = Math.max(target.length, key) // 通過splice對key位置的元素進行替換 target.splice(key, 1, val) return val } // 如果key在目標對象中已經存在,則直接賦值 if (key in target && !(key in Object.prototype)) { target[key] = val return val } // 獲取target中的observer對象 const ob = (target: any).__ob__ // 如果target是vue實例或者$data直接返回 if (target._isVue || (ob && ob.vmCount)) { process.env.NODE_ENV !== 'production' && warn( 'Avoid adding reactive properties to a Vue instance or its root $data ' + 'at runtime - declare it upfront in the data option.' ) return val } // 如果ob不存在,說明target不是響應式對象,直接賦值,不觸發視圖更新 if (!ob) { target[key] = val return val } // 如果ob存在,把key設置為響應式屬性 defineReactive(ob.value, key, val) // 發送通知,觸發視圖更新 ob.dep.notify() return val }
以上是vue 中set方法的源碼,在這里需要特別注意的是,在對數組進行處理時,所用的splice方法并不是數組本身的方法,而是在vue中封裝的具有響應式的數組方法。
到此,相信大家對“Vue的vue.$set()方法源碼案例詳解”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。