vue3中ref與reactive的區別
阿新 • • 發佈:2021-10-14
ref
建立一個響應式資料,一般來說用於建立簡單型別的響應式物件,比如String
、Number
型別
const name = ref('tom')
可以看到,ref
方法將這個字串進行了一層包裹,返回的是一個RefImpl
型別的物件,譯為引用的實現(reference implement)
,在該物件上設定了一個不可列舉的屬性value
,所以使用name.value
來讀取值。
正如上面所說,ref
通常用於定義一個簡單型別,那麼是否可以定義一個物件或者陣列?
const obj = ref({
age: 12,
sex: 'man',
})
控制檯可以看到,對於複雜的物件,值是一個被proxy
age
和sex
不是RefImpl
型別的物件,proxy
代理的物件同樣被掛載到value
上,所以可以通過obj.value.age
來讀取屬性,這些屬性同樣也是響應式的,更改時可以觸發檢視的更新
reactive
通過上面ref的使用案例,起始不管是複雜引用型別,如array,object
等,亦或者是簡單的值型別string,number
都可以使用ref
來進行定義,但是,定義物件的話,通常還是用reactive
來實現
const person = reactive({
height: 180,
})
可以看到返回的person是一個proxy
代理的物件,使用時person.height
那麼能否使用reactive
來定義普通型別?
const id = reactive('id是1')
可以看到reactive
只能被用來定義物件
ref與reactive的區別與聯絡
一般來說,ref
被用來定義簡單的字串或者數值,而reactive
被用來定義物件陣列等
ref
定義物件時,value
返回的是proxy
,reactive
定義物件時返回的也是proxy
,而這確實存在一些聯絡
ref
來定義資料時,會對裡面的資料型別進行一層判斷,當遇到複雜的引用型別時,還是會使用reactive
來進行處理
class RefImpl { constructor(value, _shallow) { this._shallow = _shallow; this.dep = undefined; this.__v_isRef = true; this._rawValue = _shallow ? value : toRaw(value); this._value = _shallow ? value : toReactive(value); } ////...... }
const toReactive = (value) => isObject(value) ? reactive(value) : value;// 判斷引數是否為物件,是物件呼叫reactive建立,否則返回原始值