探究Vue3中的Composition API:优化组件逻辑的新利器

这篇具有很好参考价值的文章主要介绍了探究Vue3中的Composition API:优化组件逻辑的新利器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、toRef函数

在 Vue 3.0 中,引入了一种新的响应式 API,即 toReftoRef 函数可以将一个普通值转换为响应式引用类型,这样就可以在模板中直接使用这个响应式引用类型的属性,并且当该属性发生变化时,视图会自动更新。

<template>
  <div>
      <h2>年龄:{{ age }}</h2>
      <h2>原值:{{person.age }}</h2>
      <button  @click="age++;console.log(age)">年龄增加</button>
  </div>
</template>

<script>
import { reactive} from 'vue';

export default {
  name: 'TodoList',
  setup() {
    // 使用 ref 创建响应式数据
    const person = reactive({
      name: 'JingYu',
      age: 18,
    })
    // 暴露数据和方法给模板使用
    return {
      age:person.age,
      person,
    };
  },
};
</script>


通过控制台打印输出的内容和页面的变化,我们可以观察到,age的值一直在变化,但其不是响应式的,所以页面没有随着值的变化而更新视图。这是因为这种写法就好比我们定义了一个新的变量,将person.age的值18赋值给这个变量。但这个变量并不是响应式的。
探究Vue3中的Composition API:优化组件逻辑的新利器,# 前端基础知识,vue.js,javascript,前端

这时我们就可以通过toRef将其转换为响应式的

    const person = reactive({
      name: 'JingYu',
      age: 18,
    })
    // 暴露数据和方法给模板使用
    let age=toRef(person,'age')
    console.log(age)
    return {
      age,
      person,
    };

细心地同学可能从上面的代码中注意到了一点,我在页面中还显示了一个person.age的值。

  <div>
      <h2>年龄:{{ age }}</h2>
      <h2>原值:{{person.age }}</h2>
      <button  @click="age++;console.log(age)">年龄增加</button>
  </div>

为什么要展示它的值呢,看了将person中age属性单独转换成一个单独的响应式引用之后,你就会发现,页面展示的两个值都会随之改变。

探究Vue3中的Composition API:优化组件逻辑的新利器,# 前端基础知识,vue.js,javascript,前端

如果你不小心写成了这种形式

let age=toRef(person.age)

你就会惊奇的发现,页面展示的person.age不会随之改变了.

探究Vue3中的Composition API:优化组件逻辑的新利器,# 前端基础知识,vue.js,javascript,前端

这里需要注意一下两种写法的区别:

1.当你使用toRef(person, 'age')时,你是在告诉Vue你希望将person对象的age属性转换为一个单独的响应式引用。这意味着当person.age的值发生变化时,引用的值也会相应地更新。
2.toRef(person.age)是将person.age直接转换为响应式引用,而不是从person对象中获取对age属性的引用。这意味着当你修改person.age的值时,引用的值不会自动更新。

二、toRefs函数

torefstoRef的作用是一样的,只不过toRefs是将一个对象的所有属性都变为单独的响应式。

    setup() {
    // 使用 ref 创建响应式数据
    const person = reactive({
      name: 'JingYu',
      age: 18,
    })
    // 暴露数据和方法给模板使用
    return {
      ...toRefs(person)
    };
  },

通过使用扩展运算符将person对象的所有属性展开返回。成功实现单个属性的响应式。

探究Vue3中的Composition API:优化组件逻辑的新利器,# 前端基础知识,vue.js,javascript,前端

三、shallowReactive 与 shallowRef

shallow是浅的、浅显的意思。

顾名思义:

  • shallowReactive:只处理对象最外层属性的响应式(浅响应式)
      <h2>年龄{{ person.age }}</h2>
      <h2>薪资{{ person.job.salary }}</h2>
      <button  @click="person.age++;console.log(person.age,'---')">年龄增加</button>
      <button  @click="person.job.salary++;console.log(person.job.salary)">薪资增加</button>
      const person = shallowReactive({
      name: 'JingYu',
      age: 18,
      job:{
        name:'前端开发',
        salary:8
      }
    })

我们可以观察到年龄是响应式的,而第二层的属性薪资就不是响应式的了。
探究Vue3中的Composition API:优化组件逻辑的新利器,# 前端基础知识,vue.js,javascript,前端

  • shallowRef:只处理基本数据类型的响应式, 不进行对象的响应式处理。
      <h2>年龄{{ person.age }}</h2>
      <button  @click="person.age++;console.log(person.age,'---')">年龄增加</button>
      const person = shallowRef({
      name: 'JingYu',
      age: 18,
    })

虽然person.age的值改变了,但数据并不是响应式的,所以页面视图没有更新。
探究Vue3中的Composition API:优化组件逻辑的新利器,# 前端基础知识,vue.js,javascript,前端

  • 使用场景

1.如果有一个对象数据,结构比较深, 但变化时只是外层属性变化 ===> shallowReactive。

2.如果有一个对象数据,后续功能不会修改该对象中的属性,而是用新的对象来替换 ===> shallowRef。

解释一下这句话:

      <h2>年龄{{ person.age }}</h2>
      <button  @click="person={age:20}">年龄改变</button>

此时点击按钮页面会变为20,因为我们改变的不是x里面的属性,而是将整个person对象重新赋值,person是响应式。的。

四、readonly 与 shallowReadonly

  • readonly: 让一个响应式数据变为只读的(深只读)。

如果使用readonly修饰对象person,所有的属性都不能修改了。当你修改时控制台还会输出警告.

<template>
	<h2>姓名:{{name}}</h2>
	<h2>年龄:{{age}}</h2>
	<h2>薪资:{{job.j1.salary}}K</h2>
	<button @click="name+='~'">修改姓名</button>
	<button @click="age++">增长年龄</button>
	<button @click="job.j1.salary++">涨薪</button>
</template>

<script>
	import {reactive,toRefs,readonly} from 'vue'
	export default {
		name: 'HelloWorld',
		setup(){
			//数据
			let person = reactive({
				name:'张三',
				age:18,
				job:{
					j1:{
						salary:20
					}
				}
			})

			person = readonly(person)
			//返回一个对象(常用)
			return {
				...toRefs(person)
			}
		}
	}
</script>

探究Vue3中的Composition API:优化组件逻辑的新利器,# 前端基础知识,vue.js,javascript,前端

如果使用shallowReadonly修饰对象person,只有最外层的不能修改了。salary还是可以修改的。

<template>
	<h2>姓名:{{name}}</h2>
	<h2>年龄:{{age}}</h2>
	<h2>薪资:{{job.j1.salary}}K</h2>
	<button @click="name+='~'">修改姓名</button>
	<button @click="age++">增长年龄</button>
	<button @click="job.j1.salary++">涨薪</button>
</template>

<script>
	import {reactive,toRefs,shallowReadonly} from 'vue'
	export default {
		name: 'HelloWorld',
		setup(){
			//数据
			let person = reactive({
				name:'张三',
				age:18,
				job:{
					j1:{
						salary:20
					}
				}
			})

			person = shallowReadonly(person)

			//返回一个对象(常用)
			return {
				...toRefs(person)
			}
		}
	}
</script>

探究Vue3中的Composition API:优化组件逻辑的新利器,# 前端基础知识,vue.js,javascript,前端

五、toRaw 与 markRaw

  • toRaw是一个用于将响应式对象转换为其原始非响应式版本的函数。

    toRaw函数接受一个响应式对象作为参数,并返回该对象的原始非响应式版本。它实际上返回了一个指向原始对象的引用,而不是创建一个新的对象。
import { reactive, toRaw } from 'vue' 
const originalObj = { foo: 'bar' } 
const reactiveObj = reactive(originalObj) 
console.log(reactiveObj.foo) // 输出 "bar" 
const rawObj = toRaw(reactiveObj) 
rawObj.foo = 'baz' // 修改原始对象 
console.log(reactiveObj.foo) // 输出 "baz"
  • markRaw是Vue3中用于标记一个对象,使其永远不会转换为响应式对象的函数。

有些值不应被设置为响应式的,例如复杂的第三方类库或Vue组件对象。在这种情况下,我们可以使用markRaw函数。

import { reactive, markRaw } from 'vue' 
const originalObj = { foo: 'bar' } 
const reactiveObj = reactive(originalObj) 
console.log(reactiveObj.foo) // 输出 "bar" 
const rawObj = markRaw(originalObj) 
console.log(isReactive(reactiveObj)) // 输出 "true" 
console.log(isReactive(rawObj)) // 输出 "false" 
// 尝试将rawObj转换为响应式对象 
const reactiveRawObj = reactive(rawObj) 
console.log(isReactive(reactiveRawObj)) // 输出 "false"

在上面的示例中,我们首先使用reactive函数将originalObj转换为一个响应式对象reactiveObj。然后,我们使用markRaw函数将originalObj转换为其非响应式版本rawObj。我们使用isReactive函数验证了reactiveObj是响应式对象,而rawObj不是。最后,我们尝试将rawObj转换为响应式对象,但是通过isReactive函数验证后发现,转换并未生效。

六、provide 与 inject

在Vue 3中,provideinject是用于跨层级组件通信的两种方法。

provide方法允许父组件向下传递数据给子组件。provide() 接受两个参数:第一个参数是要注入的 key,可以是一个字符串或者一个 symbol,第二个参数是要注入的值。

inject方法允许子组件从父组件中获取传递的数据。它接收两个参数:一个是需要注入的键值,另一个是默认值。如果父组件没有提供该键值,则inject方法将返回默认值。

具体用法

祖组件中:

setup(){
	......
    let car = reactive({name:'奔驰',price:'40万'})
    provide('car',car)
    ......
}

后代组件:文章来源地址https://www.toymoban.com/news/detail-694929.html

setup(props,context){
	......
    const car = inject('car')
    return {car}
	......
}

响应式数据的判断

  • isRef: 检查一个值是否为一个 ref 对象
  • isReactive: 检查一个对象是否是由 reactive 创建的响应式代理
  • isReadonly: 检查一个对象是否是由 readonly 创建的只读代理
  • isProxy: 检查一个对象是否是由 reactive 或者 readonly 方法创建的代理

到了这里,关于探究Vue3中的Composition API:优化组件逻辑的新利器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 从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 ,这为开

    2024年02月16日
    浏览(50)
  • 从Vue2到Vue3【四】——Composition API(第四章)

    内容 链接 从Vue2到Vue3【零】 Vue3简介 从Vue2到Vue3【一】 Composition API(第一章) 从Vue2到Vue3【二】 Composition API(第二章) 从Vue2到Vue3【三】 Composition API(第三章) 从Vue2到Vue3【四】 Composition API(第四章) 从Vue2到Vue3【五】 从Vue2到Vue3【五】——新的组件(Fragment、Teleport、S

    2024年02月16日
    浏览(41)
  • 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日
    浏览(45)
  • 【vue3 之 emits & $emit() 讲解 】监听子组件事件、emit事件验证、options写法、composition setup写法

    前言:不懂在父组件里对子组件 @xxxx 声明自定义事件,就不用看本篇文章了。本篇对此内容不做任何说明。这是与 emits 结合使用的必备知识! 场景说明: 组件功能封装:         组件封装了一系列 emit 事件,并返回数据、回调函数等,或单纯执行某个操作后,触发父组

    2023年04月09日
    浏览(55)
  • Vue 3 Composition API 详解

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

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

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

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

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

    2024年02月05日
    浏览(41)
  • vue3 配置自动导入API和组件

    1. vue3 自动导入 原理 : 预加载前,该插件自动 按需导入 了,在本vue文件中使用 api 和 组件 而 编写代码 的时候,就 无需 import 了 注意并不是全局导入,并不会影响到资源 2. API 的 自动引入 ( 尤雨溪 推荐神器) Ⅰ、使用前后对比 使用插件前: 使用插件后: Ⅱ、安装三方

    2024年02月15日
    浏览(38)
  • vue3 组合式 api 单文件组件写法

    Vue3 中的 Composition API 是一种新的编写组件逻辑的方式,它提供了更好的代码组织、类型推导、测试支持和复用性。相比于 Vue2 的 Options API,Composition API 更加灵活和可扩展。 在 Composition API 中,我们使用 setup 函数来定义组件的逻辑部分。setup 函数是一个特殊的函数,在创建组

    2024年02月12日
    浏览(41)
  • vue3组合式api单文件组件写法

    一,模板部分  二,js逻辑部分 

    2024年02月13日
    浏览(51)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包