从Vue2到Vue3【三】——Composition API(第三章)

这篇具有很好参考价值的文章主要介绍了从Vue2到Vue3【三】——Composition API(第三章)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

系列文章目录

内容 链接
从Vue2到Vue3【零】 Vue3简介
从Vue2到Vue3【一】 Composition API(第一章)
从Vue2到Vue3【二】 Composition API(第二章)
从Vue2到Vue3【三】 Composition API(第三章)
从Vue2到Vue3【四】 Composition API(第四章)


前言

随着Vue 3的发布,我们迎来了一套强大且令人兴奋的组合式API,这为开发者带来了更多灵活性和可维护性。Vue 3的组合式API不仅改变了我们编写Vue组件的方式,还引入了一些新的组件和一些小的但实用的改变。在这篇文章中,我们将深入探讨Vue 3的组合式API,并介绍一些引人注目的新组件和改变,让我们一起开始这个令人兴奋的学习之旅吧!

一、shallowReactive 与 shallowRef

  • shallowReactive:

    • shallowReactive函数用于创建一个浅响应式对象,它只会对对象的第一层属性进行响应式处理,而不会递归地对嵌套的属性进行深层次响应式处理。
    • 这在某些情况下可以提高性能和减少内存消耗,特别是当对象的嵌套层次很深或者对象非常大时
    • 适用场景:当需要对一个大型对象进行响应式处理,但只关心对象的第一层属性变化时,可以使用shallowReactive来避免深层次的响应式处理
import {shallowReactive} from 'vue'
export default {
	name: 'App',
	setup(){
		let data = ({
		name: 'John',
		age: 25,
		address: {
			street: 'Main St',
			city: 'New York'
			}
		})
		let data1 = shallowReactive(data)
		return {
				data1
		}
	}
}

由于shallowReactive函数创建的是一个浅响应式对象,所以当改变data1.name时,会触发响应
但当修改data1.address.street时,就不会触发响应 (shallowReactive:只处理对象最外层属性的响应式)

  • shallowRef:

    • shallowRef函数用于创建一个浅响应式引用它只会对值的第一层进行响应式处理,而不会递归地对嵌套的值进行深层次响应式处理 ===》只处理基本数据类型的响应式, 不进行对象的响应式处理
    • 类似于shallowReactive,这在某些情况下可以提高性能和减少内存消耗
    • 适用场景:当需要对一个值进行响应式处理,但只关心值的第一层变化时,可以使用shallowRef来避免深层次的响应式处理。
<template>
	{{name1}} 
	<button @click="name1 = '前端百草阁'">点我修改name</button>
	<br>
	{{ data1.address.street }}
	<button @click="data1.address.street = '前端百草阁'">点我修改stree</button>
</template>

<script>
import {shallowRef} from 'vue'
export default {
	name: 'App',
	setup(){
		let name = 'John'
		let data = ({
		age: 25,
		address: {
			street: 'Main St',
			city: 'New York'
			}
		})
		let data1 = shallowRef(data)
		let name1 = shallowRef(name)

		console.log(data1.value,name1.value);  // 在setup中操作数据时 要加.value
		return {
			data1,
			name1
		}
	}
}
</script>

从Vue2到Vue3【三】——Composition API(第三章),从Vue2到Vue3,vue.js,javascript,前端,vue3,Composition API
这里小伙伴们注意一个点,无论是操作数据还是使用数据都和ref、reactive一样,ref在操作数据时要加.value才能拿到对应的值

通过使用shallowReactive和shallowRef,可以根据具体的需求选择性地进行响应式处理,避免不必要的性能开销。在处理大型对象或嵌套层次较深的数据时,这些函数可以提供更好的性能和内存利用率。

二、readonly 与 shallowReadonly

  • readonly
    • 让一个响应式数据变为只读的(深只读
    • 将整个对象及其嵌套的属性设置为只读的场景,保护某些数据不被修改
<script>
import { ref, reactive, toRefs,readonly } from "vue";
export default {
  name: "deMO",
  setup() {
    //数据
    let sum = ref(0);
    let person = reactive({
      name: "张三",
      age: 18,
      job: {
        j1: {
          salary: 20,
        },
      },
    });

    person = readonly(person);
    sum = readonly(sum)

    return {
      sum,
      ...toRefs(person),
    };
  },
};
</script>

由于这里使用的是readonly深只读,所以sum以及person的每一个属性都无法被修改

  • shallowReadonly
    • 让一个响应式数据变为只读的(浅只读
    • 将对象数据的第一层属性设置为只读
<script>
import { ref, reactive, toRefs,shallowReadonly } from "vue";
export default {
  name: "deMO",
  setup() {
    //数据
    let sum = ref(0);
    let person = reactive({
      name: "张三",
      age: 18,
      job: {
        j1: {
          salary: 20,
        },
      },
    });
    
    person = shallowReadonly(person)
    sum = shallowReadonly(sum)
    
    return {
      sum,
      ...toRefs(person),
    };
  },
};
</script>

由于person设置了浅只读,所以person中的name属性值不能改变,但是person中的j1里的属性是可以修改的

  • 如果有一个对象数据,结构比较深, 但变化时只是外层属性变化 ===> shallowReactive。
  • 如果有一个对象数据,后续功能不会修改该对象中的属性 ===> shallowRef。

通过使用readonly和shallowReadonly,我们可以根据具体的需求选择性地进行保护数据的可写性,从而提高代码的可靠性和安全性。

这里注意无论是深只读还是浅只读都不会影响到原先的响应式数据,所以最好用方法返回的只读数据覆盖掉之前的响应式数据 ,更加安全
什么意思呢? 在进行只读操作后,原先的响应式数据并不会发生变化,并且当你再次修改这个响应式数据时,只读的数据会跟着变化

举个例子,大家注意看

  setup() {
    let car = reactive({ name: "奔驰", price: "40W" });
    let car1 = readonly(car)
    car.name = '宝马'
    // car1.name = '劳斯莱斯'   car1的值为只读不能修改 
    console.log(car1,car);
    
    return { };
  },
};

这里car1是car的只读数据,当car的值发生变化时,car1的值对应着也会变化,但是car1的值不能直接修改
从Vue2到Vue3【三】——Composition API(第三章),从Vue2到Vue3,vue.js,javascript,前端,vue3,Composition API
car1 的值直接修改不起作用,并且会报错
从Vue2到Vue3【三】——Composition API(第三章),从Vue2到Vue3,vue.js,javascript,前端,vue3,Composition API

三、toRaw 与 markRaw

  • toRaw函数:

    • 作用:将一个由reactive生成的响应式对象转为普通对象
    • 使用场景:用于读取响应式对象对应的普通对象,对这个普通对象的所有操作,不会引起页面更新
<script>
	import {ref,reactive,toRaw} from 'vue'
	export default {
		name: 'Demo',
		setup(){
			//数据
			let person1 = ref({
				name:'张三',
				age:18,
				job:{
					j1:{
						salary:20
					}
				}
			})
			let person = reactive({
				name:'张三',
				age:18,
				job:{
					j1:{
						salary:20
					}
				}
			})

				const p = toRaw(person) // person是reactive生成的响应式对象
				p.age++      // 普通对象的值可以改变 但是不再引起页面更新
				console.log(p)  // 转换完后的p就是一个普通对象

				const p1 = toRaw(person1.value) 
				p1.age++      
				console.log(p)  // 转换完后的p就是一个普通对象
			
			return {
				sum,
				person
			}
		}
	}
</script>

这里注意笔者为什么要写两个person,不是说toRaw的作用是把一个由reactive生成的响应式对象转换为一个普通对象么?
为什么这里还有一个由ref生成的响应式对象呢

这得透过问题看本质,ref定义一个响应式对象内部求助了reactive,所以person1.value实质上也是一个Proxy对象,所以在转换成普通对象时,要toRaw(person1.value)

再注意一个问题,大家有没有一个疑问,我把person转成了普通对象并且用一个p接收转换完后的对象,那么person自己本身有变化么

实验才能出真知,由于好奇大家才在不停的进步,尝试后发现响应式对象转换为普通对象时,并不会影响先前的响应式对象,换句话说就是person依然是响应式对象,修改它,页面依旧会发生变化
还有一个点

  setup() {
    let car = reactive({ name: "奔驰", price: "40W" });
    let car2 = toRaw(car)
    // car.name = '宝马'
    car2.name = '劳斯莱斯' 
    console.log(car,car2);
    }

从Vue2到Vue3【三】——Composition API(第三章),从Vue2到Vue3,vue.js,javascript,前端,vue3,Composition API

修改car 会改变car的值,修改car2的值同时car的值也会变

  • markRaw:
    • 作用:标记一个对象,使其永远不会再成为响应式对象
    • 应用场景:
      1. 有些值不应被设置为响应式的,例如复杂的第三方类库等。
      2. 当渲染具有不可变数据源的大列表时,跳过响应式转换可以提高性能。

      响应式追踪和更新是一个相对开销较大的操作。将复杂的第三方类库或大型对象设置为响应式的,会导致每次更新时都需要深度遍历对象并触发更新,对性能有一定影响。如果这些值不需要在视图中展示或参与响应式计算,将其设置为非响应式可以提高性能。

<script>
<script>
import { ref, reactive, toRefs, markRaw } from "vue";
export default {
  name: "deMo",
  setup() {
    let person = reactive({
      name: "张三",
      age: 18,
      job: {
        j1: {
          salary: 20,
        },
      },
    });

      let car = { name: "奔驰", price: 40 };
      person.car = markRaw(car);  // 将一个标记过的对象添加到person的属性中

      person.car.price++;  // 数据会变化  但是页面不再更新(没有响应式)
      console.log(person.car.price);

    return {
      person,
      ...toRefs(person), // 普通对象被标记过后 再也无法变成响应式的
    };
  },
};
</script>

这里注意一个点 如果说person已经是一个响应式对象了,这时及时往他身上添加一个普通的属性,这个属性也具有响应式

      let car = { name: "奔驰", price: 40 };
      person.car = car;  // 将一个普通对象添加到person的属性中

      person.car.price++;  // 数据会变化  页面会更新(有响应式)
      console.log(person.car.price);

通过使用toRaw和markRaw,我们可以有更灵活的控制对象的响应式特性。toRaw使我们能够获取响应式对象的非响应式原始值。markRaw则可以将对象标记为非响应式,避免不必要的响应式追踪和更新。这些工具在一些特定场景下提供了更好的性能和控制的选择。

总结

本文讲解了vue3组合式API中的 shallowReactive 与 shallowRefreadonly 与 shallowReadonlytoRaw 与 markRaw的用法以及注意事项,欢迎大家订阅本系列文章,干货满满!文章来源地址https://www.toymoban.com/news/detail-601715.html

到了这里,关于从Vue2到Vue3【三】——Composition API(第三章)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Vue3.0 所采用的 Composition Api 与 Vue2.x 使用的 Options Api 有什么不同?

    Composition API 可以说是Vue3的最大特点,那么为什么要推出Composition Api,解决了什么问题? 通常使用Vue2开发的项目,普遍会存在以下问题: 1、代码的可读性随着组件变大而变差 2、每一种代码复用的方式,都存在缺点 3、TypeScript支持有限 一、Options Api Options API,即大家常说的

    2024年02月12日
    浏览(35)
  • 【vue3】11-Vue 3中的Composition Api(一)

    在Vue2中,我们编写组件的方式是Options APl: Options API的一大特点就是在 对应的属性 中编写 对应的功能模块 ; 比如 data定义数据 、 methods中定义方法 、 computed中定义计算属性 、 watch中监听属性改变 ,也包括 生命周期钩子 ; 但是这种代码有一个很大的弊端: 当我们 实现某一个功

    2024年02月08日
    浏览(31)
  • 探究Vue3中的Composition API:优化组件逻辑的新利器

    在 Vue 3.0 中,引入了一种新的响应式 API,即 toRef 。 toRef 函数可以将一个普通值转换为响应式引用类型,这样就可以在模板中直接使用这个响应式引用类型的属性,并且当该属性发生变化时,视图会自动更新。 通过控制台打印输出的内容和页面的变化,我们可以观察到,age的

    2024年02月10日
    浏览(26)
  • Composition API 的优势、新的组件(Fragment,Teleport,Suspense)【Vue3】

    使用传统OptionsAPI中,新增或者修改一个需求,就需要分别在data,methods,computed里修改。 我们可以更加优雅的组织我们的代码,函数。让相关功能的代码更加有序的组织在一起。 在Vue2中:组件必须有一个根标签 在Vue3中:组件可以没有根标签,内部会将多个标签包含在一个

    2024年02月02日
    浏览(34)
  • (Java高级教程)第三章Java网络编程-第七节2:Servlet API和综合案例

    前面说过,Servlet就是Tomcat这个HTTP服务器提供给Java的一组API,来完成构建动态页面等任务。Servlet中涉及的API非常多,这里我们只关注以下三个即可,其余的可在工作中获得遇到具体场景再学习使用 HttpServlet HttpServletRequest HttpServletResponse HttpServlet :它提供了处理基于HTTP协议的

    2024年02月09日
    浏览(36)
  • vue3前端开发,感受一下组合式api和VUE2选项式的差异

    vue3前端开发,感受一下组合式api和VUE2选项式的差异!今天开始,正式开始,进入学习Vue3的内容。以后代码,案例分享,都会采用组合式api的模式为大家做展示。 今天是第一节,带大家感受一下,Vue3的组合式api和之前传统的vue2版本选项式api的差别。 首先,大家需要提前使用

    2024年01月19日
    浏览(32)
  • Vue 3 Composition API 详解

    在Vue 3中,引入了一个新的Composition API,旨在提供一种更灵活和可重用的方式来组织组件代码。Composition API基于函数式编程思想,允许开发者将逻辑和状态管理逻辑分离,使代码更加清晰和可维护。 响应式数据 在Vue 3中,响应式数据是组件状态的重要组成部分。通过使用 re

    2024年01月21日
    浏览(30)
  • 详解Vue 3 的 Composition API

    Vue 3 的 Composition API 是一种新的组合式 API 风格,它可以更好地组织和复用组件逻辑。相比于 Vue 2 的 Options API,Composition API 提供了更灵活和可组合的方式来编写组件。 下面是 Composition API 的一些特点和优势: 函数式组件:Composition API 支持使用函数式组件的方式来编写组件。

    2024年02月10日
    浏览(27)
  • vue/composition-api 的使用

    最近我们项目是 vue2,但是要使用 jsx + composition ,所以来学习一下这个 vue/composition-api (一)安装 (二)注册 在 main.ts 中 (三)使用 最基本的组件: defineComponent 本身的功能很简单,但是最主要的功能是为了 ts 下的类型推导~ 1. setup 函数 setup 在 create 实例在初始化之前调

    2024年02月05日
    浏览(32)
  • Vue Composition API之侦听器watch/watchEffect

    在日常的开发中,很多时候我们需要去对一些状态进行监听,比如当显示学生的成绩列表时,我们使用一个学生的学号student_num作为请求成绩的参数,如果没有监听机制,当学号student_num改变时,我们需要依赖用户的操作去刷新成绩。但是有了侦听器,我们可以通过侦听器去监

    2024年02月08日
    浏览(29)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包