浅谈vue3中ref、toRef、toRefs 和 reactive的区别

 更新时间:2022年07月06日 15:22:39   作者:weixin79893765432...  
本文主要介绍了浅谈vue3中ref、toRef、toRefs 和 reactive的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、ref——定义任意类型响应式数据

  • ref 能定义“任何类型”的响应式数据(ref 在 vue3 中指响应式数据)。
  • 参数可以传入任意数据类型。
  • 使用 ref 定义的属性必须通过 .value 的形式才能修改其值。属性的值一旦被修改就会触发模板的重新渲染以显示最新的值。
  • 对于在 setup 返回的 refs(return 出的对象里的属性),因为在模板中访问它们时,它们会被自动浅解包,所以在 template 中使用时无需加 .value。

1、对于在 setup 中手动返回的响应式数据,在 template 中使用时无需加 .value

例如:

<template>
  <div>{{ count }}</div>
</template>
<script>
  import { ref } from 'vue'

  export default {
    setup(props) {
      const count = ref(0)
      // 暴露给 template 的属性,可以直接在 template 中使用
      return {
        count
      }
    }
  }
</script>

2、ref 能定义“任何类型”的响应式数据

如果将 setup 写在 <script> 标签里,则该标签里的脚本都是执行在 setup 里的,并且里面声明数据均会默认地暴露给 template,在 template 中使用时无需加 .value。

例如:

<template>
  <div>{{ name }} : {{ state.age }}</div>
</template>
<script setup>
  import { ref } from 'vue'

  // 为基本数据类型添加响应式状态
  const name = ref('Marry')
  // 为复杂数据类型添加响应式状态
  const state = ref({
    age: 18
  })
  // 打印name的值
  console.log(name.value)
  // 打印count的值
  console.log(state.value.age)
</script>

二、reactive——定义响应式对象

  • 用来定义“对象类型”的响应式数据。
  • 参数只能传入对象类型,返回一个具有响应式状态的副本。
  • 使用 reactive 定义的属性可以直接使用,不需要加 .value。
  • 不要直接解构使用 reactive 定义的响应式对象,否则会造成该对象脱离 ref 响应式。需要用 toRefs 将其转化为响应式数据对象,然后再解构返回。

例如:

<template>
  <div>{{ obj.count }}</div>
</template>
<script setup>
  import { reactive } from 'vue'
  
  const obj = reactive({
    count: 0
  })
  // 使用 reactive 定义的属性可以直接使用,不需要加 .value
  console.log(state.count)
</script>

三、toRef——将一个 reactive 转化为一个 ref

  • 针对一个响应式对象(reactive 封装)的 prop(属性)创建一个 ref,且保持响应式两者 保持引用关系。
  • 接收两个参数:源响应式对象 和 属性名,返回一个 ref 数据。
  • 获取数据值的时候需要加 .value。
  • 使用 toRef 转化后生成的 ref 数据如果是引用类型数据时,那么它不是原始数据的拷贝,而是原始数据的引用,改变它的数据也会同时改变原始数据。

例如:在 setup 中使用父组件传递的 props 数据时,要引用 props 的某个属性,且要保持响应式连接,就必须使用 toRef。

<template>
  <div>{{ myTitle }}</div>
</template>
<script>
  import { defineComponent, toRef } from 'vue'

  export default defineComponent({
    props: [title],
    setup (props) {
      // 创建变量myTitle
      const myTitle = toRef(props, 'title')
      console.log(myTitle.value)
      return {
        myTitle
      }
    }
  })
</script>

四、toRefs——将多个 reactive 自动解构为多个 ref

  • toRefs 用于将响应式对象转换为普通对象,其中普通对象的每个属性都是指向原始对象相应属性的 ref,两者保持引用关系。
  • toRefs 常用于 ES6 的解构赋值操作。但是,对一个响应式对象直接解构时,解构后的数据将不再有响应式,而使用 toRefs 可以方便解决这个问题。
  • 获取数据值的时候需要加 .value。
  • 使用 toRefs 转化后生成的 ref 数据如果是引用类型数据时,那么它不是原始数据的拷贝,而是原始数据的引用,改变它的数据也会同时改变原始数据。
  • 其作用和 toRef 类似,只不过 toRef 是对一个个属性手动赋值,而 toRefs 是自动解构赋值。
<template>
  <div>{{ myTitle }}</div>
</template>
<script>
  import { defineComponent, toRefs } from 'vue'

  export default defineComponent({
    props: [title],
    setup (props) {
      // toRefs 默认使用了解构赋值,创建了变量 myTitle
      const { myTitle } = toRefs(props)
      console.log(myTitle.value)
      return {
        myTitle
      }
    }
  })
</script>

到此这篇关于浅谈vue3中ref、toRef、toRefs 和 reactive的区别的文章就介绍到这了,更多相关vue3 ref toRef toRefs reactive内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解决VUE框架 导致绑定事件的阻止冒泡失效问题

    解决VUE框架 导致绑定事件的阻止冒泡失效问题

    下面小编就为大家分享一篇vue监听滚动事件 实现某元素吸顶或者固定位置显示方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-02-02
  • Vue事件总线怎么用

    Vue事件总线怎么用

    这篇文章主要介绍了Vue事件总线的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • 在axios中使用params传参的时候传入数组的方法

    在axios中使用params传参的时候传入数组的方法

    今天小编就为大家分享一篇在axios中使用params传参的时候传入数组的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-09-09
  • Vue封装通用table组件的完整步骤记录

    Vue封装通用table组件的完整步骤记录

    对于一个中后台类的项目,一个比较常见的展示形式就是Table了,这篇文章主要给大家介绍了关于Vue封装通用table组件的相关资料,需要的朋友可以参考下
    2021-07-07
  • VUE+Element实现增删改查的示例源码

    VUE+Element实现增删改查的示例源码

    这篇文章主要介绍了VUE+Element实现增删改查的示例源码,帮助大家更好的理解和使用vue,感兴趣的朋友可以了解下
    2020-11-11
  • Vue使用moment将GMT时间转换为北京时间

    Vue使用moment将GMT时间转换为北京时间

    GMT(Greenwich Mean Time)和UTC(Coordinated Universal Time)是两个时间标准,它们在许多方面非常相似,但也有一些微小的差异,本文给大家详细介绍了Vue使用moment将GMT时间转换为北京时间,需要的朋友可以参考下
    2023-12-12
  • 一文搞懂Vue3中watchEffect侦听器的使用

    一文搞懂Vue3中watchEffect侦听器的使用

    今天我们来学习一下watch侦听器的好兄弟 watchEffect 侦听器。这个相对来说比较简单,用的不是很多,当然了,根据自己的项目情况自行决定使用,希望对大家有所帮助
    2022-07-07
  • vue点击导航页面实现自动滚动到特定位置

    vue点击导航页面实现自动滚动到特定位置

    这篇文章主要介绍了vue点击导航页面实现自动滚动到特定位置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • vue插件v-touch的坑及解决(不能上下滑动)

    vue插件v-touch的坑及解决(不能上下滑动)

    这篇文章主要介绍了vue插件v-touch的坑及解决(不能上下滑动),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • ant 菜单组件报错Cannot read property ‘isRootMenu‘ of undefined

    ant 菜单组件报错Cannot read property ‘isRootMenu‘ of undefin

    这篇文章主要介绍了ant 菜单组件报错Cannot read property ‘isRootMenu‘ of undefined解决,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08

最新评论