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

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

一、基本類型數據用ref包,引用類型用reactive包。使用ref和reactive包的數據具有響應式

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

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

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

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

ref原理

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

reactive原理

        let obj={
            name:'奔馳',
            price:30
        }
        let o=reactive(obj)
        //直接返回一個對象,所以不需要點value
        o=new Proxy(obj,{
        })
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容