Vue组件通讯方式 provide/inject 介绍以及使用场景
文章目录
- vue的通讯方式
- provide / inject的缺点
- 使用办法
- 代码案例展示一(provide字符串)
- 代码案例展示二(provide返回一个方法,并且方法返回字符串)
vue的通讯方式
父子组件:父传子prop,子通知父 emit,【 r o o t , root, root,parent,$children】
非父子组件:Vuex实现,父子层层传递、中央事务总线Bus,$ref
子组件实例可以用 this.$parent 访问父实例,子实例被存储父组件实例的 $children 数组中。但是这种只是作为访问组件的应急方法。更推荐用 props 和 events 实现父子组件通信
高阶插件/组件库: provide / inject (Vue2.2.0)
允许一个祖先组件向其所有子孙后代组件注入一个依赖,不论组件层次有多深,并在起上下游关系成立的时间里始终生效。也就是说,在父组件只要声明了provide,在其子组件,孙组件,曾孙组件等能形成上下游关系的组件中交互,无论多深都能通过inject来访问provider中的数据。而不是局限于只能从当前父组件的prop属性来获取。注意他只做祖先通后代的单向传递的一个办法。。
provide / inject的缺点
官网不建议在应用中直接使用该办法,理由很直接:他怕你"管不好"。设计项目,通常追求有清晰的数据流向和合理的组件层级关系便于调试和维护,然而这对选项支持任意层级都能访问,导致数据追踪比较困难。不知道那一层级声明了provide又或是哪些层级使用了inject。造成比较大的维护成本。因此,除组件库或高阶插件外,Vue建议用Vuex解决或其他办法处理。
使用办法
provide 提供变量
Object | () => Object
provide 选项应该是一个对象或返回一个对象的函数。 该对象包含可注入其子孙的属性。在该对象中,它支持ES6中Symbol作为key,但只在原生支持等环境下可工作。
inject 注入变量
Array<string> | { [key: string]: string | Symbol | Object }
inject 选项可以是
- 一个字符串数组
- 一个对象,key为本地绑定名,value为:在可用的注入内容中搜索用的key
- 一个对象,其 from 属性是在可用的注入内容中搜索用的key,default属性是降级情况下使用的value
提示:provide和inject绑定并不是可响应的,这是刻意为之,然而如果你传入了一个可监听的对象,那么气对象的属性还是可监听的。
代码案例展示一(provide字符串)
在父组件中provide提供变量
<template><div><p>{{ title }}</p><son></son></div>
</template>
<script>import Son from "./son"export default {name: 'Father',components: { Son },// provide选项提供变量, 提供变量是纯字符串的,可以以provide: {} 的形式书写provide: {message: 'provided by father'},data () {return {title: '父组件'}},methods: { ... }}
</script>
在子组件中,我们不使用任何父组件的信息
<template><div><p>{{ title }}</p><grand-son></grand-son></div>
</template>
<script>
import grandSon from "./grandSon "
export default {name: "Son",components: { grandSon },data () {return {title: '子组件'}},
};
</script>
在孙组件中,使用inject来注入
<template><div><p>message:{{ message }}</p></div>
</template>
<script>
export default {name: "GrandSon",inject: [ "message" ],data () {return {title: '孙组件'}},methods: { ... }
};
</script>
结果孙组件页面显示:
message: provided by father
代码案例展示二(provide返回一个方法,并且方法返回字符串)
父组件
export default {// 这里改为提供一个方法provide() {return {getTestData: this.getTestData}},data () {return {testData: null}},methods: {// 方法中返回testDatagetTestData() {return this.testData}},components: {child},created() {this.testData = {name: 'hello'}}
}
子组件
export default {// 在子组件中注入这个方法inject: ['getTestData'],created() {console.log(this.getTestData())}
}
若父组件的provide改成以下两种形式,子组件获取的注入值为null,没办法获取到实时的变量值,只获取到data第一次的初始值
provide() {return {testData: this.testData}
}
或者
provide: {testData: this.testData},
Vue组件通讯方式 provide/inject 介绍以及使用场景相关推荐
- Vue 组件化通信 provide inject ,dispatch ,boardcast
入门 作为前端最容易上手的框架,Vue入门其实没啥说的,我放一段清单的代码,大家能看懂就说明能上手了 <template><div id="app">< ...
- vue跨组件之间传值Provide/Inject
官网传送门:inject Vue2.2.0+ # 背景 关于Vue组件的通讯方式相信大家能倒背如流 父子组件:通过prop,$emit,[$root,$parent,$children] 非父子 ...
- VUE组件通讯——父子互传、互调
目录 一.通过 $parent 和 $root 获取父/根组件实例 二.通过 $refs 获取子组件实例 在循环中使用ref 三.通过 prop 向子组件传值 命名方式 动态属性 字面量语法 vs 动 ...
- vue组件深度传值provide、inject,值类型响应式的方法
文章目录 前言 一.provide,inject是什么? 二.使用步骤 1.祖先组件provide注入,并且传入的是整个this指向 2.后代组件接收 总结 前言 最近封装了一个上传,下载,查看附件的 ...
- Vue3 过10种组件通讯方式
本文简介 点赞 + 关注 + 收藏 = 学会了 本文讲解 Vue 3.2 组件多种通讯方式的基础用法,并且使用了 单文件组件 <script setup> . 众所周知,Vue.js 中一 ...
- VUE3组件 (4) 关于 Provide Inject 依赖注入
前言 以下代码和内容的使用都是在setup中,未使用TS. <script setup> </script> VUE3组件 (1) 关于defineProps() VUE3组件 ...
- vue组件传值方式有哪些
Vue 作为一个轻量级的前端框架,核心两大特性就是响应式编程和组件化. 本文针对组件之间传值做详细讲解. Vue就是由一个一个的组件构成的,组件化是它的精髓,也是最强大的功能之一.而组件实例的作用域是 ...
- vue组件通讯:父传子、子传父、事件发射详解
1.组件通讯 每个组件有自己的数据, 提供在data中:每个组件数据独立, 组件数据无法互相直接访问 (合理的) 但是如果需要跨组件访问数据, 怎么办呢? => 组件通信组件通信的方式有 ...
- vue刷新当前页面--provide / inject 用法
window.reload()/router.go(0): 采用window.reload(),或者router.go(0)刷新时,整个浏览器重新加载,闪烁.严重影响体验 provide / inje ...
最新文章
- 更好用的集群限流功能,Sentinel 发布 v1.4.2
- 关于树论【LCA树上倍增算法】
- 运维部门工作总结_2018年度工作总结
- 23种设计模式(11):责任链模式
- OpenCASCADE绘制测试线束:形状修复命令之一般命令
- 信息学奥赛C++语言:装饰水果
- Android子线程进度条不显示的问题
- java面试资料整理(高级必备)
- 基于最小二乘法的人口增长模型拟合
- PHP帮管客CRM系统源码去域名授权v2.4.4版
- 计算机能力测试在线题库,全国计算机应用能力考试题库及答案2017
- 中青杯数学建模竞赛是什么级别的比赛_2018年中青杯全国大学生数学建模竞赛...
- 首月流水2.39亿美元,《原神》的发行策略是什么?
- Python中hashlib.sha1()和hashlib.MD5()哈希算法的区别
- java微信公众号上传永久素材_微信开放平台永久素材视频文件上传
- EDP/DP转HDMI OUT 支持常用分辨率,最大支持4K@60Hz
- 光纤与PON基础概念整理
- SysML实践指南第二版(中文翻译:刘亚龙)第七章 使用模块图(BDD)建模
- 10 个Web3 设计灵感网站
- 海量微博数据舆情热点挖掘项目难点总结
热门文章
- 中国科教网网站新闻发布
- 计算机绘图图框实验报告,南京邮电大学工程制图报告模版.doc
- RuntimeError: grad can be implicitly created only for scalar outputs的原因:Pytorch不支持对张量的求导
- Spring Profiles详解
- biginteger判断相等_java中的大数BigInteger
- 网络层学习之三(选路算法,ARP)
- IDEA的全部快捷键
- Eclipse运行项目提示“类路径引用的项目不存在”
- 通过友盟分享内容到新浪微博错误解决方法
- 戴望舒—— 我用残损的手掌