文章目录

  • 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 介绍以及使用场景相关推荐

  1. Vue 组件化通信 provide inject ,dispatch ,boardcast

    入门 作为前端最容易上手的框架,Vue入门其实没啥说的,我放一段清单的代码,大家能看懂就说明能上手了 <template><div id="app">< ...

  2. vue跨组件之间传值Provide/Inject

    官网传送门:inject  Vue2.2.0+ # 背景   关于Vue组件的通讯方式相信大家能倒背如流 父子组件:通过prop,$emit,[$root,$parent,$children] 非父子 ...

  3. VUE组件通讯——父子互传、互调

    目录 一.通过 $parent 和 $root 获取父/根组件实例 二.通过 $refs 获取子组件实例 在循环中使用ref 三.通过 prop 向子组件传值 命名方式 动态属性 字面量语法 vs 动 ...

  4. vue组件深度传值provide、inject,值类型响应式的方法

    文章目录 前言 一.provide,inject是什么? 二.使用步骤 1.祖先组件provide注入,并且传入的是整个this指向 2.后代组件接收 总结 前言 最近封装了一个上传,下载,查看附件的 ...

  5. Vue3 过10种组件通讯方式

    本文简介 点赞 + 关注 + 收藏 = 学会了 本文讲解 Vue 3.2 组件多种通讯方式的基础用法,并且使用了 单文件组件 <script setup> . 众所周知,Vue.js 中一 ...

  6. VUE3组件 (4) 关于 Provide Inject 依赖注入

    前言 以下代码和内容的使用都是在setup中,未使用TS. <script setup> </script> VUE3组件 (1) 关于defineProps() VUE3组件 ...

  7. vue组件传值方式有哪些

    Vue 作为一个轻量级的前端框架,核心两大特性就是响应式编程和组件化. 本文针对组件之间传值做详细讲解. Vue就是由一个一个的组件构成的,组件化是它的精髓,也是最强大的功能之一.而组件实例的作用域是 ...

  8. vue组件通讯:父传子、子传父、事件发射详解

    1.组件通讯 每个组件有自己的数据, 提供在data中:每个组件数据独立, 组件数据无法互相直接访问 (合理的) 但是如果需要跨组件访问数据,  怎么办呢?  =>   组件通信组件通信的方式有 ...

  9. vue刷新当前页面--provide / inject 用法

    window.reload()/router.go(0): 采用window.reload(),或者router.go(0)刷新时,整个浏览器重新加载,闪烁.严重影响体验 provide / inje ...

最新文章

  1. 更好用的集群限流功能,Sentinel 发布 v1.4.2
  2. 关于树论【LCA树上倍增算法】
  3. 运维部门工作总结_2018年度工作总结
  4. 23种设计模式(11):责任链模式
  5. OpenCASCADE绘制测试线束:形状修复命令之一般命令
  6. 信息学奥赛C++语言:装饰水果
  7. Android子线程进度条不显示的问题
  8. java面试资料整理(高级必备)
  9. 基于最小二乘法的人口增长模型拟合
  10. PHP帮管客CRM系统源码去域名授权v2.4.4版
  11. 计算机能力测试在线题库,全国计算机应用能力考试题库及答案2017
  12. 中青杯数学建模竞赛是什么级别的比赛_2018年中青杯全国大学生数学建模竞赛...
  13. 首月流水2.39亿美元,《原神》的发行策略是什么?
  14. Python中hashlib.sha1()和hashlib.MD5()哈希算法的区别
  15. java微信公众号上传永久素材_微信开放平台永久素材视频文件上传
  16. EDP/DP转HDMI OUT 支持常用分辨率,最大支持4K@60Hz
  17. 光纤与PON基础概念整理
  18. SysML实践指南第二版(中文翻译:刘亚龙)第七章 使用模块图(BDD)建模
  19. 10 个Web3 设计灵感网站
  20. 海量微博数据舆情热点挖掘项目难点总结

热门文章

  1. 中国科教网网站新闻发布
  2. 计算机绘图图框实验报告,南京邮电大学工程制图报告模版.doc
  3. RuntimeError: grad can be implicitly created only for scalar outputs的原因:Pytorch不支持对张量的求导
  4. Spring Profiles详解
  5. biginteger判断相等_java中的大数BigInteger
  6. 网络层学习之三(选路算法,ARP)
  7. IDEA的全部快捷键
  8. Eclipse运行项目提示“类路径引用的项目不存在”
  9. 通过友盟分享内容到新浪微博错误解决方法
  10. 戴望舒—— 我用残损的手掌