美文网首页
vue中的provide和inject ---实例 route

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

作者: 冰落寞成 | 来源:发表于2021-06-01 08:57 被阅读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 选项应该是:

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

    五,具体使用

    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();  
        }
      }
    }
    

    相关文章

      网友评论

          本文标题:vue中的provide和inject ---实例 route

          本文链接:https://www.haomeiwen.com/subject/bxfwsltx.html