浅谈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的混合继承,有需要的朋友可以借鉴参考下,希望能够有所帮助,希望能够给你带来帮助
    2021-11-11
  • vue中provide和inject的用法及说明(vue组件爷孙传值)

    vue中provide和inject的用法及说明(vue组件爷孙传值)

    这篇文章主要介绍了vue中provide和inject的用法及说明(vue组件爷孙传值),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • 详细对比Ember.js和Vue.js

    详细对比Ember.js和Vue.js

    这篇文章主要介绍了详细对比Ember.js和Vue.js,对JS框架感兴趣的同学,可以参考下
    2021-05-05
  • Vue中使用flv.js播放视频的示例详解

    Vue中使用flv.js播放视频的示例详解

    这篇文章主要为大家详细介绍了如何在Vue项目中使用flv.js播放视频,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-04-04
  • vue中通过iframe方式加载本地的vue页面的解决方法

    vue中通过iframe方式加载本地的vue页面的解决方法

    这篇文章主要给大家介绍了在vue中如何通过iframe方式加载本地的vue页面的解决方法,文中有详细的解决流程,需要的朋友可以参考下
    2023-06-06
  • 实例分析vue循环列表动态数据的处理方法

    实例分析vue循环列表动态数据的处理方法

    本篇文章给大家详细分享了关于vue循环列表动态数据的处理方法以及相关知识点内容,有需要的朋友们参考下。
    2018-09-09
  • Vue3集成json-editor-vue3的代码实现

    Vue3集成json-editor-vue3的代码实现

    这篇文章主要介绍了Vue3集成json-editor-vue3的代码实现,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-11-11
  • 一文带你搞懂Vue3中Pinia的使用

    一文带你搞懂Vue3中Pinia的使用

    用官网的一句话来说:Pinia 是 Vue的专属状态管理库,Pinia就是为vue3而生。本文将通过一些示例详细介绍一些Pinia的使用,希望对大家有所帮助
    2022-11-11
  • vue3解决跨域问题详细代码亲测有效

    vue3解决跨域问题详细代码亲测有效

    跨域,跨的是不同域,也就是协议或主机或或端口号不同造成的现象,本文给大家分享vue3解决跨域问题详细代码亲测有效,感兴趣的朋友跟随小编一起看看吧
    2022-11-11
  • Vue报错Module build failed: Error: Node Sass version 7.0.1 is incompatible with 4.0.0.解决方案

    Vue报错Module build failed: Error: Node&nb

    这篇文章主要介绍了Vue报错Module build failed: Error: Node Sass version 7.0.1 is incompatible with 4.0.0.解决方案,需要的朋友可以参考下
    2023-06-06

最新评论