zoukankan      html  css  js  c++  java
  • vue 组件传值provide与inject

    vue 组件传值provide和inject

    应用场景

      当组件嵌套的层级过多时,通过prop将父组件的属性层层传递给后代组件,明显是繁琐而又低效的,vue提供了provide和inject,能够将父组件中的属性直接让所有后代组件访问到

    与$parent相比用什么好处

      1.不用暴露整个parent组件实例对象

      2.可以渗透到多个层级的组件,只要是后代组件都可以获取,而$parent只能是直系后代获取,多个层级后代组件就只能$parent.$parent...

    一些问题

      在子组件中vue仍然像props一样不允许子组件直接修改inject中的项的值

    代码示例

      父级中的provide定义语法

     2   //第一种,直接以对象的方式定义
     3   //优点:方便
     4   //缺点:无法访问当前的this
     5   //适用场景:传递静态数据
     6   provide: {
     7     test: "测试 定义方式1 以对象的形式定义",
     8   },
     9   //第二种,使用工厂函数定义
    10   //优点:能够直接访问当前this可以传递动态数据
    11   //适用场景: 适用与绝大多数场景,除非你传递的数据全部都是静态数据
    12   provide() {
    13     return {
    14       test: this.test,
    15     };
    16   },
    17   data() {
    18     return {
    19       test: "test",
    20     };
    21   },

      子组件使用inject接收

    <template>
      <div class="index">
        <!-- 像使用data中的熟悉一样使用inject属性 -->
        <div class="">我是children==={{ test }}</div>
        <subw></subw>
      </div>
    </template>
    
    <script>
    import subw from "./sub.vue";
    export default {
      components: { subw },
      //第一种方式:直接使用数组形式接收
      //缺点:不能定义默认值,inject中定义的字段,父组件provide中就必须要定义,否则就会报错
      inject: ["test"],
      //第二种:使用对象的方式
      //优点:能够定义默认属性,定义默认属性之后,即便父组件中没有在provide定义对应的属性,vue也会认为它是合法的,在使用时会自动使用默认属性
      inject: {
        test: {
          //你可以直接这样定义一个基本类型的值作为默认值
          default: "parent prov",
          //如果你想使用引用类型的值作为默认值的话,那么你就要定义一个工厂函数来返回他
          default: () => {
            //一个数组作为默认值
            return new Array();
            //一个object作为默认值
            return new Object();
            //一个方法作为默认值
            return function () {};
          },
          //如果父组件的provide定义的属性字段为test,而子组件中data存在一个test字段,
          //此时子组件再将inject的接收字段定义为test的话。调用this.test就会出现冲突,所以子组件inject中可以定义与provide中不同的字段来接收,只需要将from接收来源指定为provide中的目标字段即可
          from: "test2",
        },
      },
      created() {
        //  像使用data中的熟悉一样使用inject属性
        console.log(this.test);
      },
    };
    </script>
  • 相关阅读:
    最短路 dijkstra 优先队列
    树状数组+二分答案查询第k大的数 (团体程序设计天梯赛 L3-002. 堆栈)
    c++优先队列(堆)
    团体程序设计天梯赛 L3-012. 水果忍者
    团体程序设计天梯赛 L2-028. 秀恩爱分得快
    团体程序设计天梯赛 L1-049. 天梯赛座位分配(测试数据+不同方法)
    奇偶校验——设计可以检验错误位置的方法
    奇偶校验的错误概率
    Fibonacci数列时间复杂度之美妙
    团体程序设计天梯赛 L3-016. 二叉搜索树的结构
  • 原文地址:https://www.cnblogs.com/wrhbk/p/14585770.html
Copyright © 2011-2022 走看看