vue slot插槽_Vue.js同名的组件插槽slot会不会冲突?

2801a4e50d41a0109d282a7302af1eb8.png

看Vue.js的官网文档中组件插槽的部分时,我有一个疑问,每个插槽都需要一个名字,通过名字来识别不同的插槽位置。那么同名插槽会不会起冲突导致Vue无法正常识别?尤其是看到官网文档中v-for渲染的列表中也包含插槽,这不会冲突么?我决定验证一下。

多个同名插槽且显示默认内容

首先看看如果有多个同名插槽,且使用默认插槽内容时的情况:

父组件

<template>
  <div id="app">
    <HelloWorld :list="list">
    </HelloWorld>
  </div>
</template>

<script>
import HelloWorld from "./components/HelloWorld.vue";
export default {
  name: "App",
  components: {
    HelloWorld,
  },
  data() {
    return {
      list: [
        {
          title: "nihao1",
          data: "12345678901",
        },
        {
          title: "nihao2",
          data: "12345678902",
        },
        {
          title: "nihao3",
          data: "12345678903",
        },
      ],
    };
  },
  methods: {},
};
</script>

子组件

<template>
  <div class="hello">
    <ul>
      <li v-for="item in list" :key="item.title">
        <slot name="slotTitle">
          {{ item.title }}
        </slot>
        <slot name="slotData">
          {{ item.data }}
        </slot>
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  name: "HelloWorld",
  inhertAttrs: true,
  props: {
    list: Array,
  },
  data: function () {
    return {};
  },
  methods: {},
};
</script>

网页效果:

205648520ec464fffcd13b988ad7ce16.png

可以看到,在v-for列表中如果有多个相同插槽,且显示默认内容,插槽的识别也不会有冲突,显示的是不同的内容。

多个同名插槽且显示自定义相同内容

父组件

<template>
  <div id="app">
    <HelloWorld :list="list">
      <template v-slot:slotTitle>
        123
      </template>
      <template v-slot:slotData>
        456
      </template>
    </HelloWorld>
  </div>
</template>

<script>
import HelloWorld from "./components/HelloWorld.vue";
export default {
  name: "App",
  components: {
    HelloWorld,
  },
  data() {
    return {
      list: [
        {
          title: "nihao1",
          data: "12345678901",
        },
        {
          title: "nihao2",
          data: "12345678902",
        },
        {
          title: "nihao3",
          data: "12345678903",
        },
      ],
    };
  },
  methods: {},
};
</script>

子组件未变,仅仅父组件增加的插槽的自定义内容。网页效果:

17512d74f5d5afbbd6e7aa4ed6a8d8aa.png

我们在父组件指定插槽的自定义内容时,同一个插槽名实际上对应多个插槽,Vue把所有同名插槽的内容都变为了自定义内容,因此显示是相同的。

多个同名插槽且有不同插槽prop

父组件

<template>
  <div id="app">
    <HelloWorld :list="list">
      <template v-slot:slotTitle="slotScope">
        {{slotScope.item.title + 'qwe'}}
      </template>
      <template v-slot:slotData="slotScope">
        {{slotScope.item.data + 'qwe'}}
      </template>
    </HelloWorld>
  </div>
</template>

<script>
import HelloWorld from "./components/HelloWorld.vue";
export default {
  name: "App",
  components: {
    HelloWorld,
  },
  data() {
    return {
      list: [
        {
          title: "nihao1",
          data: "12345678901",
        },
        {
          title: "nihao2",
          data: "12345678902",
        },
        {
          title: "nihao3",
          data: "12345678903",
        },
      ],
    };
  },
  methods: {},
};
</script>

子组件

<template>
  <div class="hello">
    <ul>
      <li v-for="item in list" :key="item.title">
        <slot name="slotTitle" v-bind:item="item">
          {{ item.title }}
        </slot>
        <slot name="slotData" v-bind:item="item">
          {{ item.data }}
        </slot>
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  name: "HelloWorld",
  inhertAttrs: true,
  props: {
    list: Array,
  },
  data: function () {
    return {};
  },
  methods: {},
};
</script>

网页效果:

be1f0ffa8ab1a9d7346f315fe828641c.png

插槽定义中包含了prop,且每个prop内容不同,此时即使是同名插槽,Vue也能区分并且正常显示。

结论

Vue可以很好的区分同名但是内容不同的插槽,不会起冲突。但是同名插槽无法在父组件作出区分,除非使用插槽prop传递不同的变量。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值