Vue六大基本類(lèi)型中的原始值響應(yīng)式
所謂原始值即針對(duì)六大基本類(lèi)型的值的響應(yīng)式
ref
由于 proxy 無(wú)法阻止原始值的修改,故此方法在這里不管用
我們可以創(chuàng)建一個(gè)包裹對(duì)象把原始值包起來(lái);
然后在使用 reactive 將該包裹對(duì)象變成響應(yīng)式的即可
__v_isRef 屬性是用來(lái)判斷是否為 ref 包裹對(duì)象的判據(jù)
function ref(val) { // 包裹對(duì)象 const wrapper = { value: val, }; // 是否為ref的判據(jù) Object.defineProperty(wrapper, "__v_isRef", { value: true, }); // 返回響應(yīng)式數(shù)據(jù) return reactive(wrapper); }
響應(yīng)丟失
響應(yīng)丟失問(wèn)題:使用 reactive 創(chuàng)建響應(yīng)式對(duì)象后,使用多參的形式 return,則實(shí)際上返回的是普通對(duì)象而非響應(yīng)式對(duì)象!
export default { setup() { const obj = reactive({ a: 1, b: 2 }); return { ...obj, }; }, };
響應(yīng)關(guān)系建立
obj 為原響應(yīng)對(duì)象
newobj 內(nèi)擁有與 obj 同名的所有屬性值,且均一一編寫(xiě)訪問(wèn)器屬性 value
value 執(zhí)行后返回原響應(yīng)對(duì)象中的值
這樣一來(lái),修改 obj 屬性后,便會(huì)自動(dòng)觸發(fā)副作用函數(shù)執(zhí)行!
const obj = reactive({ a: 1, b: 2 }); const newobj = { a: { get value() { return obj.a; }, }, b: { get value() { return obj.b; }, }, }; console.log(newobj.a.value);
toRef 函數(shù)的實(shí)現(xiàn)
使用包裹 wrapper,內(nèi)部加上 getter、setter 方法實(shí)現(xiàn)響應(yīng)式
function toRef(obj, key) { const wrapper = { get value() { return obj[key]; }, set value(val) { obj[key] = val; }, }; Object.defineProperty(wrapper, "__v_isRef", { value: true, }); return wrapper; }
自動(dòng)脫 ref
使用 proxy 代理
判斷如果存在屬性 __v_isRef
,表示其為 ref,則返回該 ref 的值;
如果只是普通對(duì)象,那原樣返回即可
function proxyRefs(target) { return new Proxy(target, { get(target, key, receiver) { const value = Reflect.get(target, key, receiver); return value.__v_isRef ? value.value : value; }, }); }
reactive 就是一個(gè)自動(dòng)脫 ref 的例子,使用他的時(shí)候無(wú)需額外調(diào)用 value 即可獲取值
到此這篇關(guān)于Vue六大基本類(lèi)型中的原始值響應(yīng)式的文章就介紹到這了,更多相關(guān)Vue原始值響應(yīng)式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue滑塊驗(yàn)證碼組件anji-captcha的使用案例詳解
滑塊驗(yàn)證是一種常見(jiàn)的人機(jī)識(shí)別方法,這篇文章主要介紹了Vue滑塊驗(yàn)證碼組件anji-captcha的使用,本文通過(guò)實(shí)例代碼圖文相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05ant-design-vue 時(shí)間選擇器賦值默認(rèn)時(shí)間的操作
這篇文章主要介紹了ant-design-vue 時(shí)間選擇器賦值默認(rèn)時(shí)間的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨過(guò)來(lái)看看吧2020-10-10vue.js開(kāi)發(fā)實(shí)現(xiàn)全局調(diào)用的MessageBox組件實(shí)例代碼
最近學(xué)習(xí)了Vue.js,感覺(jué)組件這個(gè)地方知識(shí)點(diǎn)挺多的,而且很重要,所以決定記錄下,下面這篇文章主要給大家介紹了關(guān)于利用vue.js開(kāi)發(fā)實(shí)現(xiàn)全局調(diào)用的MessageBox組件的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-11-11vue router返回到指定的路由的場(chǎng)景分析
這篇文章主要介紹了vue router返回到指定的路由的場(chǎng)景分析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11vue?this.$refs.xxx獲取dom注意事項(xiàng)?v-if?v-for渲染的dom不能直接使用
這篇文章主要介紹了vue?this.$refs.xxx獲取dom注意事項(xiàng)?v-if?v-for渲染的dom不能直接使用問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03