浅谈vue中provide和inject 用法

news/2024/11/30 10:32:27/

provide:Object | () => Object
inject:Array | { [key: string]: string | Symbol | Object }
provide 和 inject 主要为高阶插件/组件库提供用例。并不推荐直接用于应用程序代码中。是2.2.0版本 新增的。
这对选项需要一起使用,以允许一个祖先组件向其所有子孙后代注入一个依赖,不论组件层次有多深,并在起上下游关系成立的时间里始终生效。

provide 选项应该是一个对象或返回一个对象的函数。该对象包含可注入其子孙的属性。在该对象中你可以使用 ES2015 Symbols 作为 key,但是只在原生支持 Symbol 和 Reflect.ownKeys 的环境下可工作。

inject 选项应该是:
一个字符串数组,或
一个对象,对象的 key 是本地的绑定名,value 是:
在可用的注入内容中搜索用的 key (字符串或 Symbol),或
一个对象,该对象的:
from 属性是在可用的注入内容中搜索用的 key (字符串或 Symbol)
default 属性是降级情况下使用的 value

使用场景:由于vue有$parent属性可以让子组件访问父组件。但孙组件想要访问祖先组件就比较困难。通过provide/inject可以轻松实现跨级访问祖先组件的数据

一种最常见的用法是刷新vue组件
app.vue

<template><divid="app"><router-viewv-if="isRouterAlive"/></div>
</template><script>
export default {name: 'App',components: {MergeTipDialog,BreakNetTip},data () {return {isShow: false,isRouterAlive: true},// 父组件中返回要传给下级的数据provide () {return {reload: this.reload}},methods: {reload () {this.isRouterAlive = falsethis.$nextTick(() => {this.isRouterAlive = true})}}
}
</script>
<template><popup-assign:id="id"@success="successHandle"><div class="confirm-d-tit"><span class="gray-small-btn">{{ name }}</span></div><strong>将被分配给</strong><aslot="reference"class="unite-btn">指派</a></popup-assign>
</template>
<script>
import PopupAssign from '../PopupAssign'
export default {
//引用vue reload方法inject: ['reload'],components: {PopupAssign},
methods: {// ...mapActions(['freshList']),async successHandle () {this.reload()}}
}
</script>

这样就实现了子组件调取reload方法就实现了刷新vue组件的功能,个人认为它实现了组件跨越组件传递数据方法。
下面一个例子祖组件的数据,祖孙元素调取
Ancestor.vue

<template><div id="app"></div>
</template><script>export default {data () {return {datas: [{id: 1,label: '产品一'},{id: 1,label: '产品二'},{id: 1,label: '产品三'}]}},provide {return {datas: this.datas}}}</script>

后代组件

<template><div><ul><li v-for="(item, index) in datas" :key="index">{{ item.label }}</li></ul></div>
</template><script>export default {inject: ['datas']}</script>

后代元素引入被注入数据datas,并在组件内循环输出

实际上,你可以把依赖注入看作一部分“大范围有效的 prop”,除了:
祖先组件不需要知道哪些后代组件使用它提供的属性
后代组件不需要知道被注入的属性来自哪里

提示:provide 和 inject 绑定并不是可响应的。这是刻意为之的。然而,如果你传入了一个可监听的对象,那么其对象的属性还是可响应的。

参考文献:https://cn.vuejs.org/v2/api/#provide-inject

https://cn.vuejs.org/v2/guide/components-edge-cases.html#%E4%BE%9D%E8%B5%96%E6%B3%A8%E5%85%A5


http://www.ppmy.cn/news/445357.html

相关文章

LaTeX 页面大小和页边距

页面大小和页边距 原  文&#xff1a;Page size and margins 译  者&#xff1a;Xovee 翻译时间&#xff1a;2021年11月28日 介绍 LaTeX 文档的页面是高度可定制化的&#xff0c;你可以使用geometry包来定制各种页面元素&#xff0c;例如页面大小、边距、页眉、页脚、页…

Win10问题篇之——WIN2016和WIN10关闭同步主机服务,节省磁盘频繁读取,并关闭自动维护

一&#xff1a;“同步主机_XXXXX“的服务项&#xff0c;据说是个没什么用的垃圾同步功能&#xff0c;关闭该服务能有效解决磁盘100%的问题。 关闭方法&#xff1a; 1、按下WINR调出运行&#xff0c;然后输入 regedit 回车; 2、在注册表编辑器中定位到&#xff1a;HKEY_LOCAL_M…

docker删除所有容器和镜像

确保自己有权限&#xff0c;一般先执行下面的命令获取管理员权限 sudo su1、杀死运行的容器&#xff1a; $ docker kill $(docker ps -a -q)2、删除所有容器&#xff1a; $ docker rm $(docker ps -a -q)3、强制删除所有镜像&#xff1a; $ docker rmi -f $(docker images …

钢管订购和运输

图与网络模型&#xff1a; 【1】图与网络模型及方法&#xff1a;图与网络的基本概念 【2】图&网络模型应用—最短路径问题 【3】树&#xff1a;基本概念与最小生成树 【4】匹配问题&#xff1a; 匈牙利算法 、最优指派、相等子图 【5】Euler 图和 Hamilton 图 【6】计…

Java:利用接口实现打印机案例(墨盒有彩色和黑白色,纸张有A4纸和B5纸)

把纸张和墨盒都定义为接口&#xff0c;让以后的实现类去实现它。 package com.jredu.oop.ch03; /*** 纸张接口* author Administrator**/ public interface Paper {/*** 纸张*/void paper();}package com.jredu.oop.ch03;public class A4Paper implements Paper{Overridepublic…

Kali和渗透测试

文章目录 Kali Linux使用U盘/移动硬盘以live方式启动Kali启动Kali和常见操作Kali工具集工具列表和分类aircrack-ngreaverettercap-graphicalwiresharknetdiscovernmapspartaike-scandmitryrecon-ngmaltegoniktounix-privesc-checkskipfishburpsuitesqlmap

套接字个人总结

建议看总结前先看个视频&#xff1a; C/C基础教程&#xff1a;详细讲解socket网络编程上_哔哩哔哩_bilibili 有上中下。 套接字函数总结&#xff1a; 初始化&#xff08;了解即可&#xff09;&#xff1a; 类型&#xff1a;WORD //typedef unsig…

单价数量和总价的公式_知道总价和数量怎么算单价

本文收集整理关于知道总价和数量怎么算单价的相关议题,使用内容导航快速到达。 内容导航: Q1:总价=单价*数量 只改动总价和单价,数量不变,总价与单价是成正比例变化,也就是单价降到原来的45/56,就可以了。 Q2:wps表格中数量乘以单价怎么算总价? 比如数量是A2,单价是B2…