zoukankan      html  css  js  c++  java
  • vue 父组建传值向子孙组件的新方法

    inheritAttrs 和 attrs

    /*
     * 目录结构:
     *                           child.vue(子组件)
     *  components--> Child-->
     *                           child2.vue(子子组件)
     *
     *  pages-->parent.vue(父组件)
     */
    
    // 父组件
    <template>
      <div v-color>
        <child :value="text" :count="count"></child>
      </div>
    </template>
    <script>
    import child from "../components/Child/child";
    export default {
      data() {
        return {
          text: "父组建值",
          count: 66666
        };
      },
      provide() {
        return {
          parent: this
        };
      },
      components: {
        child
      }
    };
    </script>
    
    // 子组件 child.vue
    <template>
      <div>
        <my-child v-bind="$attrs"></my-child>
      </div>
    </template>
    <script>
    import myChild from "./child2";
    export default {
      props: {
        value: {
          type: String,
          default: ""
        }
      },
      inheritAttrs: false, // 让传递给子组建的值隐藏,F12查看原本在dom上存在count="66666"标示,加上后可以在dom上不显示
      components: {
        myChild
      },
      mounted() {
        console.log(this.$attrs);
      }
    };
    </script>
    
    // 子子组件 child2.vue
    <template>
      <div>我是最子子组建:{{$attrs.count}}</div>
    </template>
    <script>
    export default {
      mounted() {
        console.log("22222:", this.$attrs) // 可以跨组件获取祖先级传入的值
      }
    };
    </script>
    

    provide 和 inject

    // 父组件 parent.vue 非响应写法
    <template>
      <div>
        <child></child>
      </div>
    </template>
    <script>
    import child from "../components/Child/child";
    export default {
      data() {
        return {
        };
      },
      provide: {
        parent: '父组建值'
      },
      components: {
        child
      }
    };
    </script>
    
    // 组件child.vue 引用 child2.vue(省略)
    // 子子组件child2.vue
    <template>
      <div>我是子子组建:{{this.parent}}</div>
    </template>
    <script>
    export default {
      mounted() {
        console.log("另外一种传值方式:", this.parent);
      },
      inject: ["parent"]
    };
    </script>
    
    
    // 父组件 parent.vue 响应写法
    <template>
      <div v-color>
        <child :value="test" :count="count"></child>
      </div>
    </template>
    <script>
    import child from "../components/Child/child";
    export default {
      data() {
        return {
            text: ''
        };
      },
      provide() {
        return {
          parent: this
        };
      },
      components: {
        child
      }
    };
    </script>
    
    // 组件child.vue 引用 child2.vue(省略)
    // 子子组件child2.vue
    <template>
      <div>我是子子组建:{{this.parent.text}}</div>
    </template>
    <script>
    export default {
      mounted() {
        console.log("另外一种传值方式:", this.parent);
        this.parent.text = "卧槽,无情"; // 可以改变父级状态值并更新页面
      },
      inject: ["parent"]
    };
    </script>
    
  • 相关阅读:
    大话设计模式-原型模式
    Unity3D实习生面试题总结-图形学相关
    UnityShader入门精要-渲染流水线
    大话设计模式-工厂方法模式
    大话设计模式-代理模式
    C#中的值类型和引用类型
    【树结构】树链剖分简单分析
    HEOI2016排序-解题报告
    普通筛法时间界的证明
    可持久化线段树
  • 原文地址:https://www.cnblogs.com/yzyh/p/12575144.html
Copyright © 2011-2022 走看看