vue中的provide和inject ---实例 route

2021-06-01  本文已影响0人  冰落寞成

一、 使用场景 ,如下图

消息提示按钮 在组件layer 里面,需要处理消息的按钮在另一个组件的子组件里面,处理一条身份认证,消息按钮的红色提示要减去1,简单的办法就是刷新当前页面

image.png

二、刷新页面

首先想到的是使用window.reload(),或者router.go(0) 刷新当前页面,但是会出现整个浏览器进行了重新加载,闪烁,体验不好。

三、解决办法

使用vue 的provide和inject

四、provide和inject 讲解

provide 和 inject 主要在开发高阶插件/组件库时使用。并不推荐用于普通应用程序代码中。

这对选项需要一起使用,以允许一个祖先组件向其所有子孙后代注入一个依赖,不论组件层次有多深,并在其上下游关系成立的时间里始终生效。

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

inject 选项应该是:

五,具体使用

5.1 在app.vue 里面改写

image.png

代码:

<template>
  <div id="app">
    <router-view v-if="isRouterAlive" />
  </div>
</template>
<script>
export default {
  name:'App',
  provide () {
    return {
      reload: this.reload
    }
  },
  data () {
    return {
      isRouterAlive: true
    };
  },
  methods: {
    reload () {
      this.isRouterAlive = false;
      this.$nextTick(() => {
        this.isRouterAlive = true;
      })
    }
  }
}
</script>

5.2 在需要使用的子组件里注入

image.png image.png

代码如下:

export default {
  name: 'headerTool',
  inject: ["reload"],
   .... // 省略的代码
  methods: {
    onMessage (e) {
      ....// 省略的代码
      this.reload();  
    }
  }
}
上一篇下一篇

猜你喜欢

热点阅读