首页 > 其他分享 >搞懂vue3的ref、reactive、toRef、toRefs

搞懂vue3的ref、reactive、toRef、toRefs

时间:2022-11-29 12:55:40浏览次数:44  
标签:name age toRefs value toRef reactive job 搞懂 ref

首先需要明确这四个函数都是用于在 setup 中创造响应式变量的。 四个函数都需要从vue中导出: import {ref, reactive, toRef, toRefs} from 'vue'

总结:
reactive对比ref

从定义数据角度对比:

- ref用来定义基本类型数据

- reactive用来定义对象(或数组)类型数据

- 备注:ref也可以用来定义对象(或数组)类型数据,它内部会自动通过reactive转为代理对象;

从原理角度对比:

- ref通过Object.defineProperty()的get与set来实现响应式(数据劫持)

- reactive通过使用Proxy来实现响应式(数据劫持),并通过Reflect操作源对象内部的数据。

从使用角度对比

- ref定义的数据:js操作数据需要.value,模板中读取时不需要.value

- reactive定义的数据,操作与读取均不需要.value

toRef, toRefs

作用: 创建一个ref对象,其value值指向另一个对象中的某个属性

语法: const name = toRef(person, 'name')

应用: 要将响应式对象中的某个属性单独提供给外部使用时

扩展: toRefs与toRef功能一致,但可以批量创建多个ref对象,语法: toRefs(person)

 

分别举例: ref使用
<template>
  <div class="demo">
    <h2>姓名: {{name}}</h2>
    <h2>年龄: {{age}}</h2>
    <h3>岗位: {{job.type}}</h3>
    <h3>工龄: {{job.workingAge}}</h3>
    <button @click="updateInfo()">更新</button>
  </div>
</template>
 
<script lang="ts">
import { defineComponent, ref } from 'vue'
 
export default defineComponent({
  setup () {
// 以下方式定义的是普通数据,非响应式数据
    // let name = '张三';
    // let age = 18;
    // let job = {
    //   type: 'web前端',
    //   workingAge: 8
    // }
    // function  updateInfo() {
    //   name = '李四';
    //   age = 20;
    //   console.log(name, age);
    // }
 
// 基本类型:ref生成一个引用对象,通过get/set做数据劫持,Ref(reference引用)Impl(implement实现)
    let name = ref('张三'); 
    let age = ref(18);
    console.log('name', name, age)
 
    // 对象类型,内部'求助'了vue3中的一个新函数reactive函数
    let job = ref({
      type: 'web前端',
      workingAge: 8
    })
    function  updateInfo() {
      // 注:模板里面不需要使用.value,模板解析时遇到 ref对象会自动读取.value
      console.log(name, age);
      name.value = '李四';
      age.value = 20;
      job.value.type = 'JAVA';
      job.value.workingAge = 10;
    }
    
    return {
      name,
      age,
      updateInfo,
      job
    }
  }
})
</script>

reactive:只用于创建引用类型数据的响应式,取值不用加.value return具体细节见代码注释

<template>
  <div class="demo">
    <h2>姓名: {{name}}</h2>
    <h3>岗位: {{job.type}}</h3>
    <h3 v-show="job.workingAge">工龄: {{job.workingAge}}</h3>
    <h3 v-show="job.age">年龄:{{job.age}}</h3>
    <button @click="updateInfo()">更新</button>
  </div>
</template>
 
<script lang="ts">
import { defineComponent, ref, reactive } from 'vue'
 
export default defineComponent({
  setup () {
    let name = ref('张三'); 
    let job: any = reactive({
      type: 'web前端',
      workingAge: 8
    })
    console.log('job', job)
    function  updateInfo() {
      name.value = '李四';
      job.type = 'JAVA';
      delete job.workingAge;// 删除工龄
      job.age = 18; // 增加年龄
      
    }
    // 返回一个对象(常用)
    return {
      name,
      job,
      updateInfo
    }
  }
})
</script>

toRef和toRefs

  setup () {
    let person = reactive({
      name: '张三',
      job: {
        j1: {
          age: 18
        }
      }
    })
 
    // 下面是几种方式的不同点描述
    return {
      person, // 直接return出去,模板中使用不能直接使用name 需要 person.name,比较麻烦
      name1: person.name, // 解构后模板中直接使用name,但是属性不再具有响应性
      name2: toRef(person, 'name'), // 通过toRef来转变成ref对象
      ...toRefs(person), // 批量转换成ref对象
    }
  }

 

标签:name,age,toRefs,value,toRef,reactive,job,搞懂,ref
From: https://www.cnblogs.com/yayuya/p/16935113.html

相关文章

  • 图文结合带你搞懂MySQL日志之Redo Log(重做日志)
    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。GreatSQL是MySQL的国产分支版本,使用上与MySQL一致。作者:KAiTO往期文章:图文结合带你搞定MySQ......
  • 做前端,你一定会SEO网页代码优化,完全搞懂有意外收获
    你一定不知道,在前端代码规范上,还有SEO代码规范,作为学习前端的你稍后了解呢?SEO代码规范一方面是为了获取流量,如果你能运用的炉火纯青,在移动端和PC端网站应用上,那么你就可以......
  • 彻底搞懂HTTPS的加密原理
    转自:https://zhuanlan.zhihu.com/p/43789231 HTTPS(SSL/TLS)的加密机制虽然是大家都应了解的基本知识,但网上很多相关文章总会忽略一些内容,没有阐明完整的逻辑脉络,我学习它......
  • 【PCB干货】是开窗还是盖油?想搞懂过孔工艺,看这篇就够了!
    过孔,即在覆铜板上钻出所需要的孔,它承接着层与层之间的导通,用于电气连接和固定器件。过孔是PCB生产至关重要且不可缺少的一环。在PCB生产中,常见的过孔工艺有:过孔盖油、过孔塞......
  • vue-ref,reactive,toRefs,toRef总结
    总结:ref,reactive,toRefs,toRef方法响应式引用的原理:通过proxy对数据进行封装,当数据变化时,触发模版等内容的更新。一、ref:作用:接受一个内部值并返回响应式且可变的ref对象......
  • 想搞懂持续交付理论和实践,你只差这三个问题
    摘要:今天,我们来了解下什么是“持续交付”及“持续交付”的实践。云原生是当下IT圈非常热门的一个词,其目的是为了各组织在公有云、私有云和混合云等新型动态环境中,构建和运......
  • 一文搞懂"衬底"“外延”的区别和联系
      在半导体产业链中,特别是第三代半导体(宽禁带半导体)产业链中,会有衬底及外延层之分,那外延层的存在有何意义?和衬底的区别是什么呢?首先,先普及一个小概念:晶圆制备包括衬......
  • ref、toRef、toRefs
     ref、toRef、toRefs都可以将某个对象中的属性变成响应式数据ref的本质是拷贝,修改响应式数据,不会影响到原始数据,视图会更新toRef、toRefs的本质是引用,修改响应式数据,会影......
  • 一篇文章彻底搞懂base64编码原理
    开始在互联网中的每一刻,你可能都在享受着Base64带来的便捷,但对于Base64的基础原理又了解多少?今天这篇文章带领大家了解一下Base64的底层实现。base64是什么东东呢?Base64编码......
  • 彻底把 MySQL的锁搞懂
       最近,同事在生产上遇到一个MySQL死锁的问题,于是在帮忙解决问题后,特意花了一周的时间,把MySQL所有的锁都整理了一遍,今天就来一起聊聊MySQL锁。申明:本文基于M......