【Vue3 知识第七讲】reactive、shallowReactive、toRef、toRefs 等系列方法应用与对比

这篇具有很好参考价值的文章主要介绍了【Vue3 知识第七讲】reactive、shallowReactive、toRef、toRefs 等系列方法应用与对比。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、reactive()

reactive() 函数用于返回一个对象的响应式代理。与 ref() 函数定义响应式数据的异同点如下:

数字化管理平台
Vue3+Vite+VueRouter+Pinia+Axios+ElementPlus
权限系统-商城
个人博客地址

  • ref 函数和 reactive 函数都是用来定义响应式数据的。

  • ref 函数更适合定义基本数据类型(可接收基本数据类型和对象)

    • 函数参数可以是基本数据类型,也可以接受对象类型

    • 如果参数是对象类型时,其实底层的本质还是 reactive,系统会自动给 ref 传入的值进行转换

      ref(1) -> reactive({value:1})
      // ref函数只能操作浅层次的数据,把基本数据类型当作自己的属性值;深层次依赖于reactive
      
    • 在 template 中访问,系统会自动添加 .value 。在 js 中需要手动 .value 进行访问

      import { ref } from 'vue'
      
      // 为基本数据类型添加响应式状态
      const name = ref('Neo')
      
      // 为复杂数据类型添加响应式状态
      const state = ref({
        count: 0
      })
      
      // 打印name的值
      console.log(name.value)
      // 打印count的值
      console.log(state.value.count)
      
    • ref 响应式原理是依赖于Object.defineProperty()get()set()

  • reactive 函数更适合定义复杂的数据类型(json/arr/obj/map/set)

    • 它的响应式是更加‘深层次’的(会影响对象内部所有嵌套的属性,所有的数据都是响应式的),底层本质是将传入的数据包装成一个 JavaScript Proxy,其行为表现与一般对象相似。不同之处在于 Vue 能够跟踪对响应式对象属性的访问与更改操作。因此不等于源对象,建议只使用响应式代理,避免使用原始对象。

      import { reactive } from 'vue'
      
      let list = reactive([])
      const addData = () => {
      	setTimeout(() => {
      		let arr = ['banana','orange','peal']
      		list.push(...arr)
      		console.log(list)
      	},1000)
      }
      
    • 参数必须是对象或者数组,如果要让对象的某个元素实现响应式时比较麻烦。需要使用 toRefs 函数处理

      import { reactive, toRefs } from 'vue'
      
      // 通过 reactive 定义响应式数据
      const state = reactive({
          // 定义每一个表单控件的配置项:type类型、label文本、prop绑定字段 等信息
          items: [{
              label: "用户名",
              prop: "name",
              inputwidth: "100%",
          }, {
              password: true,
              label: "密码",
              prop: "pwd",
              inputwidth: "100%",
              rules: [{ required: true, message: "请输入密码", trigger: 'blur' }]
          }, {
              label: "手机号",
              prop: "phone",
              inputwidth: "100%",
              required: true,
              validateType: "phone"
          }],
          // 定义每一个表单绑定字段对应的信息(form表单数据信息)
          formData: {
              name: "",
              pwd: "",
              phone: ""
          },
          // form 元素配置信息
          options: {
              size: "small",
              formWidth: "35%",//表单占父元素的宽度
              labelWidth: "80px",//标签的长度
          },
      })
      
      // 通过 toRefs 获取 reactive 中的每一项属性的引用(js中调用使用 .value,template 中直接使用自动解析)
      const { items, formData, options } = toRefs(state);
      
      console.log(items,options)
      
    • 获取数据值的时候直接获取,不需要加.value

      import { reactive } from 'vue'
      
      // 响应式状态
      const state = reactive({
        count: 0
      })
      
      // 打印count的值
      console.log(state.count)
      

二、readonly()

readonly() 函数接受一个对象 (不论是响应式还是普通的) 或是一个 ref,返回一个原值的只读代理。本身不能去修改值,但受原始对象改变的影响。

import { readonly } from "vue"

let obj = reactive({name:"Jack"})

let readObj = readonly(obj)

const change = () => {
	// 不能直接修改只读属性
	// readObj.name = "Lucy";
	
	// 受原始对象改变的影响
	obj.name = "David";
	console.log(obj,readObj);
}

只读代理是深层的:对任何嵌套属性的访问都将是只读的。它的 ref 解包行为与 reactive() 相同,但解包得到的值是只读的。

三、shallowReactive()

reactive() 的浅层作用形式。和 reactive() 不同,这里没有深层级的转换:一个浅层响应式对象里只有根级别的属性是响应式的。属性的值会被原样存储和暴露,这也意味着值为 ref 的属性不会被自动解包了。

import { reactive,shallowReactive } from "vue";

const stu = reactive({name:"Jack"})

const obj = shallowReactive({
	foo:{
		bar:{
			num:1
		}
	}
})

const change = () => {
	// reactive() 作用是深层次的,和shallowReactive() 一起使用时,会影响其数据变化
	stu.name = "David"
	// shallowReactive() 作用是浅层的,只能修改第一层的数据。深层次数据无法修改。但是会受reactive数据修改的影响。
	obj.foo.bar.num = 1000;
	console.log(obj)
}

四、shallowReadonly()

readonly() 的浅层作用形式。和 readonly() 不同,这里没有深层级的转换:只有根层级的属性变为了只读。属性的值都会被原样存储和暴露,这也意味着值为 ref 的属性不会被自动解包了。同样会受原始对象数据改变的影响。

const state = shallowReadonly({
  foo: 1,
  nested: {
    bar: 2
  }
})

// 更改状态自身的属性会失败
state.foo++

// ...但可以更改下层嵌套对象
isReadonly(state.nested) // false

// 这是可以通过的
state.nested.bar++

五、isReactive() 和 isReadonly()

  • isReactive() 函数检查一个对象是否是由 reactive()shallowReactive() 创建的代理。
  • isReadonly() 函数检查传入的值是否为只读对象。只读对象的属性可以更改,但他们不能通过传入的对象直接赋值。

数字化管理平台
Vue3+Vite+VueRouter+Pinia+Axios+ElementPlus
权限系统-商城
个人博客地址

六、toRef()

toRef() 函数基于响应式对象上的一个属性,创建一个对应的 ref。这样创建的 ref 与其源属性保持同步:改变源属性的值将更新 ref 的值,反之亦然。

toRef() 函数一次仅能设置一个数据,接收两个参数,第一个参数是哪个对象,第二个参数是对象的哪个属性。

<script setup>
    const state = reactive({
        title: '标题',
        name: 'wff'
    })
    
    const name = toRef(state, 'name')

    console.log(state.name)
    console.log(name.value)
</script>

<template>
  <div>
    name:{{name}}
  </div>
</template>

七、toRefs()

toRefs() 函数将一个响应式对象转换为一个普通对象,这个普通对象的每个属性都是指向源对象相应属性的 ref。

<script setup>
    const state = reactive({
        title: '标题',
        name: 'wff'
    })
    
    const { title } = toRefs(state)

    console.log(state.title)
    console.log(title.value)
</script>

<template>
  <div>
    title:{{title}}
  </div>
</template>

注:我们使用 reactive创建的对象,如果想在模板中使用,就必须得使用 xxx.xxx的形式;如果大量用到的话还是很麻烦的,但是使用 es6解构以后,会失去响应式。那么toRefs的作用就体现在这,利用toRefs可以将一个响应式 reactive 对象的所有原始属性转换为响应式的ref属性

八、toRaw()

toRaw() 函数可以返回由 reactive()readonly()shallowReactive() 或者 shallowReadonly() 创建的代理对应的原始对象(将响应式对象转化为普通对象)。

这是一个可以用于临时读取而不引起代理访问/跟踪开销,或是写入而不触发更改的特殊方法。不建议保存对原始对象的持久引用,请谨慎使用。

const foo = {}
const reactiveFoo = reactive(foo)

console.log(toRaw(reactiveFoo) === foo) // true

九、ref、toRef、toRefs 异同点

  • ref、toRef、toRefs 函数都可以将某个对象中的属性变成响应式数据

  • ref 函数的本质是拷贝,修改响应式数据,不会影响到原始数据(引用数据类型会有影响),视图会更新

  • toRef、toRefs 函数和传入的数据形成引用关系,修改 toRef 会影响这些数据,但是不会更新视图

    作用:把一个响应式对象转换成普通对象,该普通对象的每个属性都是一个 ref

    • toRef 函数一次仅能设置一个数据,接收两个参数,第一个参数是哪个对象,第二个参数是对象的哪个属性
    • toRefs 函数接收一个对象作为参数,它会遍历对象身上的所有属性,然后挨个调用 toRef 执行。用于批量设置多个数据为响应式
  • ref 数据会引起监听行为,而 toRef 不会文章来源地址https://www.toymoban.com/news/detail-704789.html

到了这里,关于【Vue3 知识第七讲】reactive、shallowReactive、toRef、toRefs 等系列方法应用与对比的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 玩转Vue3之shallowRef和shallowReactive

    Vue3 作为一款现代的 JavaScript 框架,引入了许多新的特性和改进,其中包括 shallowRef 和 shallowReactive 。这两个功能在 Vue 3 中提供了更加灵活和高效的状态管理选项,尤其适用于大型和复杂的应用程序。 Vue3 引入了新的响应式系统,与 Vue2 相比,它具有更好的性能和更多的功能

    2024年03月13日
    浏览(55)
  • vue3 的 ref、 toRef 、 toRefs

    1、ref: 对原始数据进行拷贝。当修改 ref 响应式数据的时候,模版中引用 ref 响应式数据的视图处会发生改变,但原始数据不会发生改变 2、toRef: 用于将对象中的某个属性转换成响应式数据。当修改 toRef 响应式数据的时候,原始数据会发生变化,但是模版中引用 toRef 响应式数

    2024年02月09日
    浏览(60)
  • ref、reactive、toRef、toRefs

    ref 作用:定义一个响应式数据 语法:const xxx = ref(initValue) 创建一个包含响应式数据的引用对象 js中操作数据:xxx.value 模板中读取数据:不需要.value,直接div{{xxx}}/div 接收的数据:基本类型、对象类型 基本类型的数据:响应式是靠object.defineProperty()的get与set完成的 对象类型的

    2024年02月08日
    浏览(46)
  • Vue3快速上手(八) toRefs和toRef的用法

    顾名思义,toRef 就是将其转换为ref的一种实现。详细请看: toRef就相当于是将对象Person里的某个属性,如name,单独解构赋值给name,并使得name同为响应式对象。且修改name的值时,person.name的值随之变化。 如下图可以看到: 1、name是一个ObjectRefImpl对象的实例。 2、底层还是个P

    2024年02月19日
    浏览(41)
  • vue3 toRefs详解

    toRefs函数的作用是将响应式对象中的所有属性转换为单独的响应式数据,对象成为普通对象,并且值是关联的。在这个过程中toRefs会做以下两件事: 把一个响应式对象转换成普通对象 对该普通对象的每个属性都做一次ref操作,这样每个属性都是响应式的 说明: reactive 对象取

    2024年02月12日
    浏览(35)
  • 搞懂 Vue3 中的各种 ref:toRef,toRefs,isRef,unref...

    在 Vue3 中,有许多与响应式相关的函数,例如 toRef、toRefs、isRef、unref 等等。合理地使用这些函数可以在实际开发中大大提高效率。本文将详细介绍这些函数的用法,让我们在实际开发中知道应该使用哪些 API 并能够熟练地回答面试官的相关问题。 大家对于 ref 这个 API 肯定都

    2024年02月12日
    浏览(53)
  • Vue3中 toRefs的基本使用

    什么是toRefs? 把一个响应式对象转换成普通对象,该普通对象的每个 property 都是一个 ref; 理解一下: 期望: 页面上展示 “小明=========…”; 实际:页面展示\\\"小明\\\",myData中name 无法响应。 解决: 通过toRefs的方式,将一个响应式 reactive 对象的所有原始属性转换为响应式的

    2024年02月11日
    浏览(34)
  • 助你丝滑过度到 Vue3 生命&自定义hook&toRef ②⑥

    @作者 : SYFStrive   @博客首页 : HomePage 📜: VUE3~TS 📌: 个人社区(欢迎大佬们加入) 👉: 社区链接🔗 📌: 觉得文章不错可以点点关注 👉: 专栏连接🔗 👉 TypeScript (🔥) 👉 微信小程序 (🔥) 👉 UNIAPP开发 (🔥) 提示:以下是本篇文章正文内容 简介 : 2020年9月

    2024年02月15日
    浏览(42)
  • vue3 #ref #reactive

    一、ref 函数将简单类型的数据包装为响应式数据 import { ref } from \\\'vue\\\'  const count = ref(10) 一、reactive函数将复杂类型的数据包装为响应式数据 import { reactive} from \\\'vue\\\'  const obj= reactive({     name : \\\'zs\\\',     age : 18 })

    2024年02月22日
    浏览(51)
  • Vue3 ref与reactive

    在当今Web开发领域中,构建交互性强、可复用且易于维护的用户界面是至关重要的。而Vue.js作为一款现代化且流行的JavaScript框架,正是为了满足这些需求而诞生。它采用了MVVM架构模式,并通过数据驱动和组件化的方式,使我们能够更轻松地构建出优雅而高效的Web应用程序。

    2024年01月24日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包