• 051_末晨曦Vue技术_处理边界情况之provide和inject依赖注入


    provide和inject依赖注入

    点击打开视频讲解更详细

    在此之前,在我们描述访问父级组件实例的时候,展示过一个类似这样的例子:

    <google-map>
      <google-map-region v-bind:shape="cityBoundaries">
        <google-map-markers v-bind:places="iceCreamShops"></google-map-markers>
      </google-map-region>
    </google-map>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这个组件里,所有的后代都需要访问一个 getMap 方法,以便知道要跟哪个地图进行交互。不幸的是,使用 $parent property 无法很好的扩展到更深层级的嵌套组件上。这也是依赖注入的用武之地,它用到了两个新的实例选项:provide 和 inject

    provide 选项允许我们指定我们想要提供给后代组件的数据/方法。在这个例子中,就是 内部的 getMap 方法:

    provide: function () {
      return {
        getMap: this.getMap
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    然后在任何后代组件里,我们都可以使用 inject 选项来接收指定的我们想要添加在这个实例上的 property:

    inject: ['getMap']
    
    • 1

    相比 $parent 来说,这个用法可以让我们在任意后代组件中访问 getMap,而不需要暴露整个 实例。这允许我们更好的持续研发该组件,而不需要担心我们可能会改变/移除一些子组件依赖的东西。同时这些组件之间的接口是始终明确定义的,就和 props 一样。

    实际上,你可以把依赖注入看作一部分“大范围有效的 prop”,除了:

    • 祖先组件不需要知道哪些后代组件使用它提供的 property
    • 后代组件不需要知道被注入的 property 来自哪里

    完整案例:

    祖先组件

    <template>
      <div id="app">
        App {{ name }}
        {{ obj.name }}
        <button @click="changeName">改变</button>
        <HelloWorld></HelloWorld>
      </div>
    </template>
    
    <script>
    import HelloWorld from './components/HelloWorld'
    export default {
      name: 'App',
      data(){
        return {
          name:'末晨曦吖',
          obj:{
            name:'漫天'
          }
        } 
      },
      mounted(){
        
      },
      provide () {
        return {
          name: this.name,  //基本数据类型 不是响应式的;
          obj:this.obj,     //使用引用数据类型实现响应式效果;
          change:this.change,
          _this:this
        }
      },
      components:{
        HelloWorld
      },
      methods:{
        changeName(){
          this.name = '满天星辰',
          this.obj.name = '不及你'
        },
        change(){
          console.log('55555');
        }
      }
    }
    </script>
    
    <style scoped>
     
    </style>
    
    • 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
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50

    父组件:src\components\HelloWorld.vue

    <template>
      <div class="hello">
        HelloWorld:{{ name }}
        <Category></Category>
      </div>
    </template>
    
    <script>
    import Category from './Category.vue'
    export default {
      name: 'HelloWorld',
      props: [],
      inject: ['name'],
      data(){
        return{
          
        }
      },
      mounted(){
        
      },
      components:{
        Category
      },
      methods:{
        
      }
    }
    </script>
    
    <style scoped>
    
    </style>
    
    • 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

    孙子组件:src\components\Category.vue

    <template>
      <div class="category">
    	Category{{ name }}
    	{{ obj.name }}
    	{{ _this.name }}
      </div>
    </template>
    
    <script>
    export default {
      name: "Category",
      inject: ['name','change',"obj","_this"],
      mounted(){
        this.change()
    	console.log(this._this)
      },
    };
    </script>
    
    <style scoped>
    </style>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    若对您有帮助,请点击跳转到B站一键三连哦!感谢支持!

  • 相关阅读:
    ThinkPHP6 多应用模式之验证码模块的配置与验证
    Zookeeper-命令操作
    Automatically Generate a TOC for your PDF
    CPT-CY3/CY5/CY7/CY7.5/花菁染料CY3/Y5/CY7/CY7.5/抗Trop-2 IgG抗体偶联顺铂的制备
    Python列表、元组、字典、集合、字符串总结篇
    mediapipe流水线分析 二
    少儿编程之冒泡排序
    【编程强训11】最近公共祖先+求最大连续bit数
    前端数据可视化之【series、series饼图配置】配置项
    Spring注解之@Configuration和@Bean功能简介说明
  • 原文地址:https://blog.csdn.net/LS_952754/article/details/126406299