Xin's blog Xin's blog
首页
  • 前端文章

    • HTML
    • CSS
    • JavaScript
    • Vue
    • 组件与插件
    • CSS扩展语言
  • 学习笔记

    • 《JavaScript教程》笔记
    • 《JavaScript高级程序设计》笔记
    • 《ES6 教程》笔记
    • 《Vue》笔记
    • 《TypeScript 从零实现 axios》
    • 《Git》学习笔记
    • TypeScript笔记
    • JS设计模式总结笔记
  • 前端框架面试题汇总
  • 基本面试题
  • 进阶面试题
  • 其它
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 前后端联调
  • mock.js
  • 奇技淫巧
  • 分类
  • 标签
  • 归档
关于
GitHub (opens new window)

Xin

英雄可不能临阵脱逃啊~
首页
  • 前端文章

    • HTML
    • CSS
    • JavaScript
    • Vue
    • 组件与插件
    • CSS扩展语言
  • 学习笔记

    • 《JavaScript教程》笔记
    • 《JavaScript高级程序设计》笔记
    • 《ES6 教程》笔记
    • 《Vue》笔记
    • 《TypeScript 从零实现 axios》
    • 《Git》学习笔记
    • TypeScript笔记
    • JS设计模式总结笔记
  • 前端框架面试题汇总
  • 基本面试题
  • 进阶面试题
  • 其它
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 前后端联调
  • mock.js
  • 奇技淫巧
  • 分类
  • 标签
  • 归档
关于
GitHub (opens new window)
  • HTML

  • CSS

  • JavaScript

  • Vue

    • 知识点

      • filters过滤器的使用
      • watch的使用
      • createElement函数创建虚拟DOM
      • mixin的使用
      • 插槽
      • vuex的基本使用
      • 路由传参
      • 组件通信之 $attrs 和 $listeners
      • 组件通信之 $parent 和 $children
      • 组件通信之 provide 和 inject
        • 概念
        • 定义
      • 使用vue的model选项实现组件通信
      • v-on监听多个方法
      • axios的基本使用
      • vue中的鼠标事件、鼠标滚轮事件、键盘事件
      • Vue为什么要求组件模板只能有一个根元素
      • Vue中data为什么必须是一个函数?
      • Vue中的scoped和scoped穿透
      • vue-router传参,在页面刷新后数据格式改变的问题
      • 相同的组件,vue会直接复用
      • Vue项目使用mock数据的几种方式
      • Vue CLi3 修改webpack配置
    • 方法

    • vue API

  • 组件与插件

  • css扩展语言

  • 学习笔记

  • 前端
  • Vue
  • 知识点
ctrlwin
2021-07-27

组件通信之 provide 和 inject

# 组件通信之 provide 和 inject

# 概念

成对出现: provide和inject是成对出现的

作用:用于父组件向子孙组件传递数据

使用方法: provide在父组件中返回要传给下级的数据,inject在需要使用这个数据的子辈组件或者孙辈等下级组件中注入数据。

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

# 定义

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

inject 选项应该是:

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

注意

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

provide/inject:简单的来说就是在父组件中通过provider来提供变量,然后在子组件中通过inject来注入变量。

​ 需要注意的是这里不论子组件有多深,只要调用了inject那么就可以注入provide中的数据。而不是局限于只能从当前父组件的prop属性来获取数据。

示例:

下面是一个常见的使用方式:

<template>
  <div
    id="app"
  >
    <router-view
      v-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 = false
      this.$nextTick(() => {
        this.isRouterAlive = true
      })
    }
  }
 }
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// 子孙组件接收父组件传递的方法
export default {
//引用vue reload方法
  inject: ['reload'],
methods: {
    async successHandle () {
      this.reload()
    }
  }
}
1
2
3
4
5
6
7
8
9
10

这样就实现了子组件调取reload方法就实现了刷新vue组件的功能。

在GitHub上编辑 (opens new window)
#vue
上次更新: 2/23/2022, 5:36:03 PM

← 组件通信之 $parent 和 $children 使用vue的model选项实现组件通信→

最近更新
01
createElement函数创建虚拟DOM
05-26
02
clipboard 剪切板属性
05-26
03
vue的权限管理
05-16
更多文章>
Theme by Vdoing | Copyright © 2021-2022 Xin | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×