关于 provide、inject 在Vue3中的用法

Vue3关于 provide、inject 的用法


前言:
在父子组件传递数据时,通常使用的是 props 和 emit。
父传子时,使用的是 props,如果是父组件传孙组件时,就需要先传给子组件,子组件再传给孙组件,如果多个子组件或多个孙组件使用时,就需要传很多次,会很麻烦。

像这种情况,可以使用 provide 和 inject 解决这种问题,不论组件嵌套多深,父组件都可以为所有子组件或孙组件提供数据,父组件使用 provide 提供数据,子组件或孙组件 inject 注入数据。同时兄弟组件之间传值更方便。

用一个案例来讲解
1、画绿色框框的是子组件,也就是定义在src/components中的公共部品
2、截图中其余部分为父页面,也就是定义在src/views中的业务画面
需求下拉勾选库区后,下拉框的值显示在子页面。但是“重置”按钮在父页面。要求点击“重置”按钮可以将子页面的"库区选择"清空
在这里插入图片描述

一、传递变量/数据

provide和inject就可以理解成是用provide发,用inject接收。
provide和inject都需要从Vue中导入,可以在main.js中全局导入,也可以在单页面中导入。
在这里插入图片描述下方代码为最上方的案例
父页面(cs-select-tree就是子组件)

	<template>
			<el-row>
				<el-form :model="state.queryForm" ref="queryRef" :inline="true">
					<cs-select-tree v-model:spaceList="spaceList"></cs-select-tree>
					<el-form-item>
						<el-button icon="search" type="primary" @click="searchAction()">
							{{ $t('common.queryBtn') }}
						</el-button>
						<el-button icon="Refresh" @click="resetQuery">{{ $t('common.resetBtn') }}</el-button>
					</el-form-item>
				</el-form>
			</el-row>
			<el-row>
				<div class="mb8" style="width: 100%">
					<el-button type="primary" class="ml10" icon="Remove" @click="cancelAction()" :disabled="multiple">
						{{ '取消' }}
					</el-button>
				</div>
			</el-row>
	</template>

<script setup lang="ts" >
// 搜索变量
const spaceId = ref();

//provide('给inject的传递标记', 传递的变量/数据); 
//'传递标记'就是子页面用inject注册时的标记
//若传递的是响应式数据(此示例中的spaceId就是),那么在父页面改变响应数据时,子页面的也会跟着变。
provide('provideSpaceId', spaceId);

// 清空搜索条件
const resetQuery = () => {
	spaceId.value = '';
};
</script>



子组件

<template>
	<el-form-item label="库区选择" class="search-tree-select">
		<el-tree-select
			v-model="storeSpaceId"
			:data="storeTree"
			:render-after-expand="false"
			:check-strictly="false"
			show-checkbox
			multiple
			class="w100"
			placeholder="请选择"
			ref="treeRef"
			@check-change="getCheckedNodes"
		>
		</el-tree-select>
	</el-form-item>
</template>

<script setup lang="ts" name="csSelectTree">
const emit = defineEmits(['update:spaceList']);
import { getStoreLinkList } from '/@/api/basic/store';
//定义变量
const storeTree = ref<any[]>([]); 
const treeRef = ref();

//inject('provide的传递标记', '可省略,用于没有provide没传值时的默认值,因为组件可能会被多个页面调用,但并不是所有页面都需要provide')
const storeSpaceId = inject('provideSpaceId', '');
</script>

二、传递函数

父页面

const num = ref(0);
const add = () => {
	num.value++;
};
provide('provideNum', num);
provide('provideAdd', add);

子页面

	<div>
		{{ '数据是' + num }}
		<el-button @click="add()">加加加</el-button>
	</div>

const num = inject('provideNum', 0);
const add = inject('provideAdd', () => {});
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Vue3 provideinject 是一种新的组件通信方式,可以让父组件向子孙组件传递数据,而不需要一层层地传递。provideinject 都是在组件实例创建之前被调用的,provide 可以提供数据,而 inject 可以注入这些数据。使用 provideinject 的时候需要注意,只有在 provide 提供的数据才能被注入,而且注入的数据是响应式的。 ### 回答2: vue3provideinject是一对用于父子组件之间传递数据的方法。provide函数负责在父组件注册一个值或者对象,后面的子组件可以通过inject来引入这个值或对象。 provide函数接受一个键值对作为参数,其键是一个字符串,值可以是任意类型的数据或者对象。通过provide函数提供的数据,在整个组件树都可以访问到。 在子组件,通过inject函数来引入父组件提供的数据。inject函数可以接受一个字符串数组或者一个对象作为参数,数组的字符串是匹配provide键的名称,对象的键是inject的名称,值是provide的键。 使用provideinject方法可以实现父组件向子组件传递数据的目的,而不需要显式的通过props进行传递。这种方式的好处是在任何层级的子组件都可以获取到数据,而不需要一层层向下传递。这在复杂的组件嵌套结构特别有用。 需要注意的是,在provide提供的数据可以是响应式的,即当提供的数据发生变化时,所有引入该数据的子组件都会相应地更新。这在跨组件状态管理时非常有用。 总结来说,provideinjectvue3实现父子组件传递数据的方法,它们可以实现在整个组件树提供数据,并且支持响应式更新。在日常开发,我们可以根据具体的业务需求选择使用这两个方法来进行组件间的数据传递。 ### 回答3: Vue3provideinject是一对新的特性,用于在组件之间共享数据和函数。它们是Vue3提供的新的API,相比于Vue2的provideinject,有更加简洁和灵活的用法。 在父组件,我们可以使用provide来提供一个数据或方法,将其暴露给子组件使用。provide接受一个对象或返回一个对象的函数作为参数,这个对象可以包含我们想要共享的数据和方法。 而在子组件,我们可以使用inject来注入父组件提供的数据或方法。inject同样接受一个数组或对象作为参数,用于声明我们要注入的数据或方法。当我们在子组件使用inject时,它会去父组件寻找对应的provide提供的数据或方法,并将其注入到子组件,使得我们可以在子组件直接使用。 provideinject的使用方式非常灵活,可以在任何组件层级使用,并且可以嵌套使用。父组件提供的数据或方法可以被所有子组件注入使用,而不需要一层层地通过props传递。这样可以大大简化组件之间的通信和数据传递,提高组件的灵活性和可复用性。 总结而言,Vue3的provideinject是一对用于在组件之间共享数据和方法的特性。它们提供了一种简洁和灵活的方式,让我们能够方便地在组件层级共享数据和方法,避免了繁琐的props传递,提高了组件的可复用性和灵活性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值