setup+ref+reactive實(shí)現(xiàn)vue3響應(yīng)式功能
setup 是用來(lái)寫(xiě)組合式 api ,內(nèi)部的數(shù)據(jù)和方法需要通過(guò) return 之后,模板才能使用。在之前 vue2 中,data 返回的數(shù)據(jù),可以直接進(jìn)行雙向綁定使用,如果我們把 setup 中數(shù)據(jù)類型直接雙向綁定,發(fā)現(xiàn)變量并不能實(shí)時(shí)響應(yīng)。接下來(lái)就看看setup如何實(shí)現(xiàn)data的響應(yīng)式功能?
一、ref
setup 內(nèi)的自定義屬性不具備響應(yīng)式能力,所以引入了 ref ,ref 底層通過(guò)代理,把屬性包裝值包裝成一個(gè) proxy ,proxy 內(nèi)部是一個(gè)對(duì)象,使得基礎(chǔ)類型的數(shù)據(jù)具備響應(yīng)式能力,使用之前必須引入。
示例1:ref 使用
<template> <div> <input type="text" v-model="mood"> {{mood}} </div> </template> <script> import { ref } from "vue" export default{ setup(){ let mood = ref("此時(shí)心情好差呀!") setTimeout(()=>{ mood.value = "心情要變的像人一樣美" },3000) return{ mood } } } </script>
此時(shí)可以在 setup 模板內(nèi)任意編輯 mood,可以保證實(shí)時(shí)響應(yīng)。實(shí)例在修改 mood 的值加了 value ,是因?yàn)?ref 的工作原來(lái):
let mood = ref("此時(shí)心情好差呀!")
修改成:let mood = proxy({value:"此時(shí)心情好差呀!"})
二、reactive
上述的 ref 讓基礎(chǔ)數(shù)據(jù)類型具備了響應(yīng)式,但是如果我們換成引用類型的數(shù)據(jù),就會(huì)失效。所以引入了 reactive。
reactive 通過(guò)底層包裝,將引用類型數(shù)據(jù)包裝到 proxy 內(nèi),使用原理如:
let me = reactive({ single:true, want:"暖的像火爐的暖男" }) // 運(yùn)行結(jié)果為 let me = proxy : { single: true, want:"暖的像火爐的暖男" }
引用的時(shí)候,直接使用 me.want 就可以了。
示例2:reactive 使用
<template> <div> {{me.want}} </div> </template> <script> import { ref , reactive } from "vue" export default{ setup(){ let me = reactive({ single:true, want:"暖的像火爐的暖男" }) setTimeout(()=>{ me.want = "夏天容易化了" },3000) return{ me } } } </script>
通過(guò) setup + ref + reactive 就可以完全實(shí)現(xiàn) vue2 中 data 的響應(yīng)式功能,所以 setup 完全可以替換掉 data。
三、toRefs 、toRef 應(yīng)用
setup + ref + reactive 實(shí)現(xiàn)了數(shù)據(jù)響應(yīng)式,不能使用 ES6 解構(gòu),會(huì)消除響應(yīng)特性。所以需要 toRefs 解構(gòu),使用時(shí),需要先引入。
它的工作原理為:
import { ref , reactive, toRefs } from "vue" let me = reactive({ single:true, want:"暖的像火爐的暖男" }) //運(yùn)行為 let me = proxy : { single: true, want:"暖的像火爐的暖男" } const { single, want } = toRefs( me ) // 運(yùn)行為 single : proxy({ value:true }) want : proxy({ value:"暖的像火爐的暖男" })
toRefs 把 single 和 want 解構(gòu)成兩個(gè) proxy ,所以是響應(yīng)式的。
示例3:toRefs 解構(gòu)數(shù)據(jù)
<template> <div> {{want}} <input type="text" v-model="want"> </div> </template> <script> import { ref , reactive, toRefs } from "vue" export default{ setup(){ let me = reactive({ single:true, want:"暖的像火爐的暖男" }) setTimeout(()=>{ me.want = "夏天容易化了" },3000) // 解構(gòu) const {single,want} = toRefs(me) return{ single, want } } } </script>
toRef作用:將對(duì)象某一個(gè)屬性,作為引用返回。比較難理解,可以打印查看下結(jié)果更容易理解。
let me = reactive({ single:true, want:"暖的像火爐的暖男" }) let lv = toRef( me, 'love' ) console.log('love',love); //打印結(jié)果 ObjectRefImpl { __v_isRef: true _key: "love" _object: Proxy {single: true, want: "暖的像火爐的暖男"} value: undefined [[Prototype]]: Object }
toRef 是組件之間進(jìn)行傳值值,對(duì)可選參數(shù)進(jìn)行處理,運(yùn)行時(shí),先查看 me中是否存在 love ,如果存在時(shí)就繼承 me 中的 love ,如果不存在時(shí)就創(chuàng)建一個(gè) love ,然后解構(gòu)賦值給變量 lv。
示例4:toRef 使用
<template> <div> {{want}} <input type="text" v-model="want"> </div> </template> <script> import { ref , reactive, toRefs, toRef } from "vue" export default{ setup(){ let me = reactive({ single:true, want:"暖的像火爐的暖男" }) setTimeout(()=>{ me.want = "夏天容易化了" },3000) const {single,want } = toRefs(me) const love = toRef(me,'love') console.log('love',love); return{ single, want } } } </script>
四、總結(jié)
ref 讓基礎(chǔ)數(shù)據(jù)類型具備響應(yīng)式,而 reactive 讓引用類型的數(shù)據(jù)具備響應(yīng)式。setup + ref + reactive 完全實(shí)現(xiàn) vue2 中 data 響應(yīng)式功能。
toRefs 解構(gòu) reactive 包裝的數(shù)據(jù),toRef 用于對(duì)可選參數(shù)。
以上所述是小編給大家介紹的通過(guò)setup+ref+reactive實(shí)現(xiàn)vue3響應(yīng)式功能,希望對(duì)大家有所幫助。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
基于Vue框架vux組件庫(kù)實(shí)現(xiàn)上拉刷新功能
這篇文章主要為大家詳細(xì)介紹了基于Vue框架vux組件庫(kù)實(shí)現(xiàn)上拉刷新功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11uniapp?APP中內(nèi)嵌webview的H5與APP相互通訊動(dòng)態(tài)傳參代碼示例
最近外部公司的app要接入我司的uni H5項(xiàng)目,所以這篇文章主要給大家介紹了關(guān)于uniapp?APP中內(nèi)嵌webview的H5與APP相互通訊動(dòng)態(tài)傳參的相關(guān)資料,需要的朋友可以參考下2024-04-04vue3中v-for報(bào)錯(cuò)'item'is?of?type'unknown'的
在寫(xiě)vue3+ts的項(xiàng)目,得到一個(gè)數(shù)組,需要循環(huán)展示,使用v-for循環(huán),寫(xiě)完之后發(fā)現(xiàn)有個(gè)報(bào)錯(cuò),接下來(lái)通過(guò)本文給大家介紹vue3中v-for報(bào)錯(cuò)?‘item‘?is?of?type?‘unknown‘的解決方法,感興趣的朋友一起看看吧2023-11-11Vue如何實(shí)現(xiàn)數(shù)據(jù)的上移和下移
這篇文章主要介紹了Vue如何實(shí)現(xiàn)數(shù)據(jù)的上移和下移問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06vite獲取所有環(huán)境變量(env)的實(shí)現(xiàn)方法
本文主要介紹了vite獲取所有環(huán)境變量(env)的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-06-06vue中使用elementUI自定義校驗(yàn)及點(diǎn)擊提交不生效問(wèn)題解決辦法
我們?cè)陧?xiàng)目中經(jīng)常會(huì)用到ElementUI的表單驗(yàn)證,下面這篇文章主要給大家介紹了關(guān)于vue中使用elementUI自定義校驗(yàn)及點(diǎn)擊提交不生效問(wèn)題解決的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12vue中關(guān)于confirm確認(rèn)框的用法
這篇文章主要介紹了vue中關(guān)于confirm確認(rèn)框的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08