Vue3——組合式api中的ref&reactive

Vue3引入了全新的功能,組合式api
組合式api的作用是:將原來分散開來定義的數(shù)據(jù),方法,計(jì)算屬性,監(jiān)聽器,組合起來定義一個(gè)完整的業(yè)務(wù)
setup是組合式api的舞臺(tái),所有的組合式都要在setup里面使用
ref用于定義響應(yīng)式數(shù)據(jù)let {ref}=Vue
使用ref()方法,定義一個(gè)響應(yīng)式對(duì)象。直接定義的數(shù)據(jù)不具備響應(yīng)式,想要有響應(yīng)式就要使用組合式api里的ref方法包裹一下
修改ref對(duì)象的值要通過value屬性
所有的組合式api要在setup方法里面使用,最后記得要return出去,這一點(diǎn)很棒,vue3的打包體積是vue2的一半(用組合式api的方式寫).不是所有的數(shù)據(jù)在頁面中顯示和調(diào)用(方法調(diào)方法)。之前定義是整體暴露?,F(xiàn)在是按需導(dǎo)出。

一、基本類型數(shù)據(jù)用ref包,引用類型用reactive包。使用ref和reactive包的數(shù)據(jù)具有響應(yīng)式

    <li>車名:{{car.name}}</li>   在模本中使用不用點(diǎn)vaule,在setup中使用需要點(diǎn)value
    <li>車價(jià):{{car.price}}</li>
        // 組合式api的作用是:將原來分散開來定義的數(shù)據(jù),方法,計(jì)算屬性,監(jiān)聽器,組合起來定義一個(gè)完成的業(yè)務(wù) 
         // vue2中方式寫代碼,vue3中也可以這樣寫代碼(可以用Vue3開發(fā),但不用vue3的語法)
        // vue3中引入了全新的功能,組合式API
        // ref用于定義響應(yīng)式數(shù)據(jù)
        // 以前定義數(shù)據(jù)需要包data函數(shù),現(xiàn)在不需要了可以在setup中定義數(shù)據(jù)
        let {ref}=Vue
        Vue.createApp({
            // setup是組合式api的舞臺(tái),所有的組合式api都要在setup里面使用
            setup() {
                // 好處可以分開寫數(shù)據(jù),分組相關(guān)的數(shù)據(jù)
                    let carName=ref('保時(shí)捷')
                    // 直接定義的數(shù)據(jù)沒有響應(yīng)式,需要想要具有響應(yīng)式就要用ref()包裹一下
                    // 可以把ref當(dāng)成響應(yīng)式對(duì)象
                    let carPrice=ref('100W')
                    // 模塊中的數(shù)據(jù)想要使用一定要返回出去,
                    // 組合式api方式寫會(huì)大大節(jié)約打包體積
                  function updateCar(){  //函數(shù)申明式
                    //   通過ref對(duì)象綁定的數(shù)據(jù),修改對(duì)象的值,要通過value屬性
                      console.log(carName);
                      carName.value="特斯拉"
                      carPrice.value="80W"
                  }
                //   所有模塊在一起,后期修改起來很方便
                    let planeName=ref('波音747')
                    let planePrice=ref('10y')
                    function updatePlane(){
                    phoneName.value="B52轟炸機(jī)"
                    phonePrice.value="30y"
                 }
             
                    // 模塊需要幾個(gè)暴露幾個(gè),在頁面中執(zhí)行就要return出去
                    return{
                        carName,
                        carPrice,
                        planeName,
                        planePrice,
                        watchName,
                        watchPrice,
                        phoneName,
                        phonePrice,
                        updateCar,
                        updatePlane,
                        updateWatch,updatePhone
                    }
            },
vue2
            // data() {
            //     return {
            //         carName:'保時(shí)捷',
            //         carPrice:'100W',
            //     }
            // },
            // 這種方法寫是整體暴露
            // methods: {
            //     updateCar(){
            //         this.carName='特斯拉',
            //         this.carProce="80w"
            //     }
            // },
        }).mount('#app')

使用ref既可以定義基本數(shù)據(jù)類型,又可以定義引用類型數(shù)據(jù)(用ref定義的不管是基本類型數(shù)據(jù)或引用類型的數(shù)據(jù)都需要點(diǎn)value)
Vue3又退出了組合式api ——reactive專門用來定義引用類型數(shù)據(jù)
使用方法在對(duì)象上用reactive包一下,修改時(shí)不需要再通過value同步數(shù)據(jù),寫法上操作更簡(jiǎn)單(注意:reactive不能定義基本數(shù)據(jù)類型)

    //  ref和reactive用于定義響應(yīng)式數(shù)據(jù)
         let {ref,reactive}=Vue
Vue.createApp({
    // 所有的組合式api要在setup方法里面使用
setup() {
    // 使用ref定義基本類型數(shù)據(jù)
    let name=ref('張三')
    let updateName=()=>{  //字面量或表達(dá)式
        // 修改值時(shí)要點(diǎn)value
        name.value='李四'
    }
    // 使用ref定義引用類型數(shù)據(jù)
    let car=ref({
    name:'奔馳',
    price:30
    })
    let updateCar=()=>{
  car.value.name="奧迪"
  car.value.price=40
    }
    // 使用reactive定義引用類型數(shù)據(jù)
    // 注意:reactive只能定義引用類型數(shù)據(jù)  值類型用ref
    let plane=reactive({
        name:'長(zhǎng)城',
        price:300

    })
    let updatePlane=()=>{
        plane.name="東風(fēng)",
        plane.price=400
    }
    console.log(car);
    // stup方法,放回出的對(duì)象里面的成員,可以在模板中使用,可以按需導(dǎo)出
    return{
        name,updateName,car,updateCar,plane,updatePlane
    }
}
}).mount('#app')

ref原理

        // 原生對(duì)象不具備響應(yīng)式,Vue3會(huì)對(duì)原生對(duì)象進(jìn)行處理,返回一個(gè)proxy
        let obj={
            name:'奔馳',
            price:30
        }
        let o=ref(obj)
        // 01.將源對(duì)象,生成一個(gè)對(duì)應(yīng)的代理對(duì)象
        let proxy=new Proxy({
            get(){},
            set(){},
            deleteProperty(){}
        })
        // 02.將代理對(duì)象給o對(duì)象的value屬性.只有點(diǎn)value才能獲取到代理對(duì)象
        o.value=proxy

reactive原理

        let obj={
            name:'奔馳',
            price:30
        }
        let o=reactive(obj)
        //直接返回一個(gè)對(duì)象,所以不需要點(diǎn)value
        o=new Proxy(obj,{
        })
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容