Vue3入门 - provide和inject组合使用

ops/2024/10/9 6:37:08/

        在Vue3中,provide和inject是用于实现依赖注入的一对API。它们允许在组件树中传递和接收数据,而不需要通过每一层显式地传递props。在<script setup>语法中,provide可以用来提供一个值,而inject可以用来接收一个已经提供的值。

        provide是setup函数内部的一个函数,所以不能在组件的选项对象(如data、methods、computed等)中使用provide,必须在setup函数内部调用它。

一、示例

        首先在项目中创建父组件,示例如下:

<template>  <ChildComponent />  
</template>  <script setup lang="ts">  
import { provide, ref } from 'vue';  
import ChildComponent from './ChildComponent.vue';  // 使用 provide 提供这个变量  
provide('message', 'Hello from Parent!');  
</script>

        再创建子组件,用于接收注入的message信息,示例如下:

<template>  <div>{{ message }}</div>  
</template>  <script setup lang="ts">  
import { inject } from 'vue';  
// 使用 inject 接收提供的值  
const message = inject('message', 'Default Message'); // 第二个参数是默认值,可选  
console.log('message', message)
</script>

        此时子页面中会显示父组件中provide注入的信息,如下图:

二、子组件中数据更新

        在provide中不仅可以注入变量数据,也可以注入函数。所以需要在子组件中修改父级provide中数据,在父组件中通过provide再注入一个修改变量值函数即可。这里将上述示例稍作修改下,再来看看演示的结果。

        父组件代码如下:

<template><div><ChildComponent></ChildComponent></div>
</template>
<script lang="ts" setup>
import ChildComponent from './ChildComponent.vue';  
import { provide, ref } from 'vue';
// 定义变量
const result = ref(0)
// 使用 provide 提供这个变量  
provide('result', result);  
// 使用 provide 提供修改变量的函数
provide('resultChange', (value: number) => result.value = value)
</script>

        子组件代码如下:

<template>  <div style="margin-bottom: 10px;">结果:{{ result }}</div>  <el-button @click="addEvent()">增加</el-button><el-button @click="mulEvent()">减少</el-button>
</template>  <script setup lang="ts">  
import { inject, ref } from 'vue';  
// 使用 inject 接收提供的值  
const result = inject('result', ref(0)); // 第二个参数是默认值,可选  
const resultChange = inject('resultChange', (value: number) => console.log(value))
// 增加
const addEvent = () => resultChange(result.value+1)
// 减少
const mulEvent = () => resultChange(result.value-1)
</script>

        页面效果如下:

        如果项目中已安装了并注入pinia,则可以在pinia看到provided数据了,如下图:

        上述示例中,点击“增加”或“减少”,页面的数值则会随之增加 或 减少了。

三、父组件中数据更新

        将子组件中操作数值内容,移至父组件后,再看下效果。

        父组件代码如下 :

<template><div><ChildComponent></ChildComponent><el-button @click="addEvent()">增加</el-button><el-button @click="mulEvent()">减少</el-button></div>
</template>
<script lang="ts" setup>
import ChildComponent from './ChildComponent.vue';  
import { provide, ref } from 'vue';// 定义变量
const result = ref(0)
// 使用 provide 提供这个变量  
provide('result', result);  
// 增加
const addEvent = () => result.value += 1
// 减少
const mulEvent = () => result.value -= 1
</script>

        子组件代码如下:

<template>  <div style="margin-bottom: 10px;">结果:{{ result }}</div>  
</template>  <script setup lang="ts">  
import { inject, ref } from 'vue';  
// 使用 inject 接收提供的值  
const result = inject('result', ref(0)); // 第二个参数是默认值,可选  
</script>

        此时继续增、减操作,页面结果还是可以正常接收并更新结果。如下图:

四、setup顶层使用

        这里需要注意的是,provide应该在setup中顶层使用,而不是在setup中的另一个函数中使用。

        错误代码如下:

<template><div><ChildComponent></ChildComponent><el-button @click="addEvent()">增加</el-button><el-button @click="mulEvent()">减少</el-button></div>
</template>
<script lang="ts" setup>
import ChildComponent from './ChildComponent.vue';  
import { provide, ref } from 'vue';// 定义变量
const result = ref(0)
// 使用 provide 提供这个变量  
// provide('result', result);  
// 增加
const addEvent = () => {result.value += 1provide('result', result)
}
// 减少
const mulEvent = () => result.value -= 1
</script>

        如上写法,将provide放到函数中调用,则会报错: [Vue warn]: provide() can only be used inside setup();所以我们在使用provide时,应将其放在顶层定义,创建一个空的或有初始值的ref,将其传给provide函数。 然后在操作功能函数中,修改如上result变量值即可。


http://www.ppmy.cn/ops/123040.html

相关文章

QD1-P7 HTML常用标签:div和span

本节学习&#xff1a;div 和 span 标签。 本节视频 www.bilibili.com/video/BV1n64y1U7oj?p7 ‍ 一、div 标签 用途 ​<div>​ 标签在 HTML 中是一个通用 容器 &#xff0c;用于将 HTML 文档中的内容分组并在文档中划分区域。<div> ​元素本身不具有特定的含…

CSMA/CD协议整理

CSMA/CD协议&#xff0c;即载波监听多路访问/冲突检测技术&#xff0c;是以太网中解决数据包冲突的关键机制。以下是对CSMA/CD协议进行冲突检测的详细解释和介绍&#xff1a; 一、CSMA/CD协议概述 CSMA/CD协议的核心思想是“先听后发&#xff0c;边发边听&#xff0c;冲突停发…

mysql join的使用

MySQL 支持以下 JOIN 语法用于 SELECT 语句和多表 DELETE 和 UPDATE 语句中的 table_references 部分&#xff1a; table_references: 查询中涉及的一个或多个表的引用&#xff0c;可以是简单表名或 JOIN 表达式的组合。 escaped_table_reference [, escaped_table_referenc…

EXCEL_光标百分比

Public Sub InitCells()Dim iSheet As LongFor iSheet Sheets.Count To 1 Step -1Sheets(iSheet).ActivateActiveWindow.Zoom 85ActiveWindow.ScrollRow 1ActiveWindow.ScrollColumn 1Sheets(iSheet).Range("A1").ActivateNext iSheetEnd Sub对日项目中的文档满天…

【算法】- 查找 - 多路查找树(B树)

文章目录 前言一、多路查找树&#xff08;B树&#xff09;二、2-3树的查找2-3树查找代码 三、2-3树的插入2-3树代码 2-3树代码总结 前言 上次我们学了如何用平衡二叉树来插入和查找。这些算法都是在内存中进行&#xff0c;若我们要操作的数据非常大&#xff0c;大到内存没办法处…

LSTM-EAAtention-Transfomer——基于有效附加注意力的时间序列预测

1 数据集介绍 ETT(电变压器温度)&#xff1a;由两个小时级数据集&#xff08;ETTh&#xff09;和两个 15 分钟级数据集&#xff08;ETTm&#xff09;组成。它们中的每一个都包含 2016 年 7 月至 2018 年 7 月的七种石油和电力变压器的负载特征。 traffic(交通) &#xff1a;描…

乐鑫ESP32-C2设备联网方案低成本高性能新选择,启明云端乐鑫代理商

在物联网(IoT)的世界中&#xff0c;设备之间的连接性是至关重要的。随着技术的进步&#xff0c;市场对于更小、更高效、成本效益更高的解决方案的需求日益增长。 在数字化时代&#xff0c;连接性是一切的基础。无论是个人设备还是工业系统&#xff0c;都需要稳定可靠的连接来实…

gaussdb hccdp认证模拟题(多选)

1.以下哪些方式可以查询数据库信息&#xff1f; (1 分) A. \l B. \db C. select * from pg_database; D. select * from gs_database; --AC 2.以下哪些权限是开启三权分立后系统管理员不再具备的权限&#xff1f; (1 分) A. 用户管理权限 B. 表空间管理权限 C. …