Vue组件入门(十四)依赖注入

简介: Vue组件入门(十四)依赖注入

前言


之前我们说过,通过props可以在父组件中向子组件传递数据。但是有些时候,子组件的下面还有子组件,组件会出现多层嵌套的情况,当最深层组件需要父组件的数据的时候,就会出现一个props逐级透传的情况,而组件也会形成一个一个巨大的组件树。


而在这个props的传递过程中,你会发现其中的有些组件可能并不需要这些props传递下来的数据,但是为了保证最深层的组件得到预期的数据,只能进行逐级透传。显然这种情况我们是不想看到的。


而为了解决这个问题vue也给提供了两个属性,来帮助我们解决这个问题 -- provide和inject。下面我们来具体看一看它把。


provide


通过provide()函数,我们可以使父组件对组件后代提供数据。也就是说,父组件可以作为一个依赖提供者,其后代的所有组件都可以通过注入的形式获取父组件提供的依赖。


<script setup>
import { provide } from 'vue'
provide(/* 注入名 */ 'title', /* 值 */ '我是标题!')
</script>
复制代码


我们可以看到,provide接收两个参数,第一个参数是注入名,第二个参数是提供的值。而后代组件可以通过注入名来进行相应的数据注入。而且一个组件也可以进行多次调用provide进行注册。


当然,如果你想建立一个响应式的依赖,也可以通过ref来实现:


import { ref, provide } from 'vue'
const title = ref('我是标题')
provide('title', title)
复制代码


inject


通过inject()函数,可以注入其上级组件的数据。


<script setup>
import { inject } from 'vue'
const title = inject('title')
</script>
复制代码


注意:如果提供的值是一个ref,为了保持其响应性,是不会进行自动解包的。


Symbol作为注入名


当我们在做一个数据业务复杂的大型项目时,可能会出现多个依赖,而我们就可以通过Symbol来作为注入名来避免命名冲突。


// injectKeys.js
export const injectionTitle = Symbol()
复制代码


// 在供给方组件中
import { provide } from 'vue'
import { injectionTitle } from './injectKeys.js'
provide(injectionTitle, { /*
  要提供的数据
*/ });
复制代码


// 注入方组件
import { inject } from 'vue'
import { injectionTitle } from './injectKeys.js'
const injectionTitle = inject(injectionTitle)


相关文章
|
7天前
|
缓存 JavaScript UED
Vue 中实现组件的懒加载
【10月更文挑战第23天】组件的懒加载是 Vue 应用中提高性能的重要手段之一。通过合理运用动态导入、路由配置等方式,可以实现组件的按需加载,减少资源浪费,提高应用的响应速度和用户体验。在实际应用中,需要根据具体情况选择合适的懒加载方式,并结合性能优化的其他措施,以打造更高效、更优质的 Vue 应用。
|
6天前
|
JavaScript
如何在 Vue 中使用具名插槽
【10月更文挑战第25天】通过使用具名插槽,你可以更好地组织和定制组件的模板结构,使组件更具灵活性和可复用性。同时,具名插槽也有助于提高代码的可读性和可维护性。
13 2
|
6天前
|
JavaScript
Vue 中的插槽
【10月更文挑战第25天】插槽的使用可以大大提高组件的复用性和灵活性,使你能够根据具体需求在组件中插入不同的内容,同时保持组件的结构和样式的一致性。
11 2
|
6天前
|
前端开发 JavaScript 容器
在 vite+vue 中使用@originjs/vite-plugin-federation 模块联邦
【10月更文挑战第25天】模块联邦是一种强大的技术,它允许将不同的微前端模块组合在一起,形成一个统一的应用。在 vite+vue 项目中,使用@originjs/vite-plugin-federation 模块联邦可以实现高效的模块共享和组合。通过本文的介绍,相信你已经了解了如何在 vite+vue 项目中使用@originjs/vite-plugin-federation 模块联邦,包括安装、配置和使用等方面。在实际开发中,你可以根据自己的需求和项目的特点,灵活地使用模块联邦,提高项目的可维护性和扩展性。
|
7天前
|
缓存 JavaScript UED
Vue 中异步加载模块的方式
【10月更文挑战第23天】这些异步加载模块的方式各有特点和适用场景,可以根据项目的需求和架构选择合适的方法来实现模块的异步加载,以提高应用的性能和用户体验
|
JavaScript
Vue的非父子组件之间传值
全局事件总线 一种组件间通信的方式,适用于任意组件间通信
|
缓存 JavaScript 前端开发
Vue Props、Slot、v-once、非父子组件间的传值....
Vue Props、Slot、v-once、非父子组件间的传值....
81 0
|
JavaScript
Vue中父子组件传值
先在⽗组件中给⼦组件的⾃定义属性绑定⼀个⽗组件的变量
|
JavaScript
vue 组件传值
vue 组件传值
81 0
|
JavaScript
vue父子组件传值
vue父子组件传值