vue3组合api响应式记录

  • Post author:
  • Post category:vue




reactive

返回对象的响应式副本

const obj = reactive({ count: 0 })

响应式转换是“深层”的——它影响所有嵌套 property。在基于 ES2015 Proxy 的实现中,返回的 proxy 是不等于原始对象的。建议只使用响应式 proxy,避免依赖原始对象。



ref

接受一个内部值并返回一个响应式且可变的 ref 对象。ref 对象具有指向内部值的单个 property .value。

实际使用中也可以包裹对象。官方推荐我们在定义数据的时候,reactive定义复杂的数据类型的数据,ref推荐定义基本数据类型。就是需要注意内部访问的值不一样。ref类型在底层会自动转换成reactive类型

ref的本质是拷贝,与原始数据没有引用关系



toRef

可以用来为源响应式对象上的某个 property 新创建一个 ref。然后,ref 可以被传递,它会保持对其源 property 的响应式连接。

使用toRef将某个对象中的属性变成响应式数据,修改响应式数据是会影响到原始数据的。如果修改通过toRef创建的响应式数据,并不会触发UI界面的更新,但解构后就可以关联。



toRefs

将响应式对象转换为普通对象,其中结果对象的每个 property 都是指向原始对象相应 property 的 ref。

希望将对象的多个属性都变成响应式数据,并且要求响应式数据和原始数据关联,并且更新响应式数据的时候不更新界面,就可以使用toRefs,但解构后就可以关联。用于批量设置多个数据为响应式数据。(toRef一次仅能设置一个数据)

toRefs接收一个对象作为参数,它会遍历对象身上的所有属性,然后挨个调用toRef执行。

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script src="https://unpkg.com/vue@next"></script>
</head>
<body>
  <div id="app">
    <p>ref方式</p>
    <p>名称:{{ obj.name }}</p>
    <p>数量:{{ obj.count }}</p>
    <p>reactive方式</p>
    <p>名称:{{ obj1.name }}</p>
    <p>数量:{{ obj1.count }}</p>
    <p>toRefs方式</p>
    <p>名称:{{obj2.name }}</p>
    <p>数量:{{ obj2.count }}</p>
    <p>toRefs解构方式</p>
    <p>名称:{{name }}</p>
    <p>数量:{{ count }}</p>
  <button @click="obj.count++">ref方式增加</button>
  <button @click="obj1.count++">reactive方式增加</button>
  <button @click="obj2.count++">toRefs增加</button>
  <button @click="count++">toRefs解构增加</button>
  <button @click="change">setup内增加</button>
    <button-btn></button-btn>
  </div>
  <script>
   
    const { reactive, computed, watch,toRefs,toRef,ref } = Vue
    let options = {
      setup() {
        const obj = ref({ count: 1,name:"orgin" })
        const obj1 = reactive({ count: 1,name:"orgin" })
        obj.value.count = 3
        console.log(obj.value.count)
        const obj2 = toRefs(obj1)
        console.log(obj,obj1,obj2)
        function change(){
          obj2.name.value = 'apple';
          obj2.count.value++;
      console.log(obj1,obj2)
    }
        return {
          obj,
          obj1,
          obj2,
          ...obj2,
          change
        }
      }
    }
    
    const app = Vue.createApp({...options})
  
    app.mount('#app')
  </script>
</body>

在这里插入图片描述

在这里插入图片描述



版权声明:本文为weixin_43941712原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。