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,{
        })
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容