Vue2透過送信

1. 透明伝送とは

透過的送信は通信レベルの概念であり、通信中に送信されるビジネス コンテンツに関係なく、ビジネス データの内容を変更することなく、送信されたコンテンツを送信元アドレスから宛先アドレスに転送することだけを担当します。
vue2 では、コンポーネントは深くネストされたシナリオを持っています。たとえば、ビジネスで提供されたデータを
A -> B -> C
取り込みA、それらをレイヤーごとに渡します。転送のプロセスには、通常 2 つのオプションがあります:

  1. 名前で受け取りprops继续次に内层渡します
  2. 変数$listenersと連携し一括透過送信すること$attrsv-onv-bind

2. 属性透過送信: v-bind="$attrs"& イベント透過送信:v-on="$listeners"

<template>
  <div>
    <p @click="click()">CT</p>
    <p>{
   
   { a }} - {
   
   { c }}</p>
  </div>
</template>

<script>
export default {
      
      
  name: "CT",
  props: {
      
      
    a: {
      
      
      type: String,
      default: "",
    },
    c: {
      
      
      type: String,
      default: "",
    },
  },
  data() {
      
      
    return {
      
      };
  },
  methods: {
      
      
    click() {
      
      
      this.$emit("click");
    },
  },
};
</script>
<template>
  <div>
    <p>BT</p>
    <CT v-bind="$attrs" v-on="$listeners"></CT>
  </div>
</template>

<script>
import CT from "./CT.vue";

export default {
      
      
  name: "BT",
  components: {
      
       CT },
  data() {
      
      
    return {
      
      };
  },
  methods: {
      
      
    click() {
      
      
      this.$emit("click");
    },
  },
};
</script>
<template>
  <div>
    <p>AT</p>
    <BT a="b" c="t" @click="click()"></BT>
  </div>
</template>

<script>
import BT from "./BT.vue";

export default {
      
      
  name: "AT",
  components: {
      
       BT },
  data() {
      
      
    return {
      
      };
  },
  methods: {
      
      
    click() {
      
      
      console.log("AT");
    },
  },
};
</script>

A -> B -> C

  • v-bind="$attrs"呼び出しをA组件指定されたものB组件にバインドします属性 全部透传C组件
  • v-on="$listeners"呼び出しをA组件指定されたものB组件にバインドします事件 全部透传C组件

こうして、受け継がれるもの、受け継がれてA组件いくもの想要C组件属性事件

3. 属性の範囲

<template>
  <div>
    <p @click="click()">CT</p>
    <p>{
   
   { a }} - {
   
   { c }}</p>
  </div>
</template>

<script>
export default {
      
      
  name: "CT",
  props: {
      
      
    a: {
      
      
      type: String,
      default: "",
    },
    c: {
      
      
      type: String,
      default: "",
    },
  },
  data() {
      
      
    return {
      
      };
  },
  methods: {
      
      
    click() {
      
      
      this.$emit("click");
    },
  },
};
</script>
<template>
  <div>
    <p>BT</p>
    <CT c="cc" v-bind="$attrs" v-on="$listeners" a="aa"></CT>
  </div>
</template>

<script>
import CT from "./CT.vue";

export default {
      
      
  name: "BT",
  components: {
      
       CT },
  data() {
      
      
    return {
      
      };
  },
  methods: {
      
      
    click() {
      
      
      this.$emit("click");
    },
  },
};
</script>

結果:

AT
BT
CT
aa - cc

属性の位置が isv-bind前または is であってもv-bind后、属性はその属性にバインド具名属性されます覆盖 v-bind同名

4. イベントのマージ

<template>
  <div>
    <p @click="click()">CT</p>
    <p>{
   
   { a }} - {
   
   { c }}</p>
  </div>
</template>

<script>
export default {
      
      
  name: "CT",
  props: {
      
      
    a: {
      
      
      type: String,
      default: "",
    },
    c: {
      
      
      type: String,
      default: "",
    },
  },
  data() {
      
      
    return {
      
      };
  },
  methods: {
      
      
    click() {
      
      
      this.$emit("click");
    },
  },
};
</script>
<template>
  <div>
    <p>BT</p>
    <CT c="cc" v-bind="$attrs" v-on="$listeners" a="aa" @click="clickBT()"></CT>
  </div>
</template>

<script>
import CT from "./CT.vue";

export default {
      
      
  name: "BT",
  components: {
      
       CT },
  data() {
      
      
    return {
      
      };
  },
  methods: {
      
      
    click() {
      
      
      this.$emit("click");
    },
    clickBT() {
      
      
      console.log("clickBT")
    }
  },
};
</script>

コンソールをクリックするCT:console输出

clickBT                      BT.vue?ec36:22 
AT                           AT.vue?b678:19

同名事件合并一緒に実行され都会被执行、最初に実行され具名方法、次にv-on内部で実行されます绑定的同名方法

5. イベントをマージせずに上書きする方法

<template>
  <div>
    <p @click="click()">CT</p>
    <p>{
   
   { a }} - {
   
   { c }}</p>
  </div>
</template>

<script>
export default {
      
      
  name: "CT",
  props: {
      
      
    a: {
      
      
      type: String,
      default: "",
    },
    c: {
      
      
      type: String,
      default: "",
    },
  },
  data() {
      
      
    return {
      
      };
  },
  methods: {
      
      
    click() {
      
      
      this.$emit("click");
    },
  },
};
</script>
<template>
  <div>
    <p>BT</p>
    <CT c="cc" v-bind="$attrs" v-on="{...$listeners, click: clickBT}" a="aa"></CT>
  </div>
</template>

<script>
import CT from "./CT.vue";

export default {
      
      
  name: "BT",
  components: {
      
       CT },
  data() {
      
      
    return {
      
      };
  },
  methods: {
      
      
    click() {
      
      
      this.$emit("click");
    },
    clickBT() {
      
      
      console.log("clickBT")
    }
  },
};
</script>

コンソールをクリックするCT:console输出

clickBT                      BT.vue?ec36:22 
AT                           AT.vue?b678:19

を使用して扩展运算符実行できます覆盖事件不做合并

6、v-bind="$attrs"& はv-on="$listeners"絶対的なものではありません

$attrs内置变量これはを参照するvue であり调用本组件时上面绑定的属性を参照する$listenersvue でもあります背中は である必要はありません背中は である必要はありません次のようにすることができます: 内置变量调用本组件时上面绑定的事件
v-bind$attrsv-on$listeners
v-bind="$props"v-bind="xxx"v-bind="{a: 1, b: 2}"v-listeners="xxx"

参考

おすすめ

転載: blog.csdn.net/letianxf/article/details/128422082