vue中插槽slot的一些用法及作用

vue中插槽slot的一些用法及作用

//这是父组件代码
<template>
  <div class="homeSlot">
    <h2>组件1</h2>
    <use-slot-one style="background: azure;">
      {{replaceContent}}
    </use-slot-one>

    <h2>组件2</h2>
    <use-slot-two style="background: beige;">
      <template v-slot:header>
        {{replaceHeader}}
        <use-slot-one>{{replaceContent}}</use-slot-one>
      </template>
      <template v-slot:main>
        {{replaceMain}}
      </template>
      <template #footer>
        <p>#footer具名插槽的缩写</p>
        {{replaceFooter}}
      </template>
      <template v-slot:default>
        {{replaceContent +'匹配内容'}}
      </template>
      除了template中的匹配内容
    </use-slot-two>

    <h2>组件3</h2>
    <use-slot-three style="background: lightblue;">
      <!--这里前三个template中的内容实现的效果相同,只不过后者会覆盖前者-->
      <template v-slot:default="slotProps">
        <h5>独占默认插槽写法</h5>
        {{slotProps.user.lastName}}
      </template>
      <template v-slot="slotProps">
        <h5>独占默认插槽的缩写语法</h5>
        {{slotProps.user.firstName}}
      </template>
      <template v-slot="{user}">
        <h5>解构式写法</h5>
        {{user.fullName}}
      </template>

      <template v-slot:other="otherSlotProps">
        slotProps is NOT available here
      </template>
    </use-slot-three>
  </div>
</template>

<script>
//引入子组件
  import UseSlotOne from './UseSlotOne';
  import UseSlotTwo from './UseSlotTwo';
  import UseSlotThree from './UseSlotThree'

  export default {
    name: "HomeSolt",
    //注册子组件
    components: {
      UseSlotOne,
      UseSlotTwo,
      UseSlotThree
    },
    data() {
      return {
        replaceContent: '这是将要用来替换solt默认内容的部分',
        replaceHeader: '这是将要用来替换头部默认内容的部分,此处可以是一个组件',
        replaceMain: '这是将要用来替换主体默认内容的部分,此处可以是一个组件',
        replaceFooter: '这是将要用来替换底部默认内容的部分,此处可以是一个组件',
      }
    },
    methods: {}
  }
</script>

<style scoped>
  .homeSlot {
    background: bisque;
    width: 80%;
    height: auto;
    margin: 0 auto;
  }
</style>

//这是第一种用法的子组件
<template>
  <div>
    <h3>这是slot的第一种用法</h3>
    <slot>{{defaultContent}}</slot>
  </div>
</template>

<script>
  export default {
    name: "UseSolt",
    data() {
      return {
        defaultContent: '我是solt中的默认内容'
      }
    },
    methods: {}
  }
</script>

<style scoped>

</style>

//这是第二种用法的子组件
<template>
  <div class="container">
    <h3>这是slot的第二种用法</h3>
    <header>
      <slot name="header">{{defaultHeader}}</slot>
    </header>
    <main>
      <slot name="main">{{defaultMain}}</slot>
    </main>
    <h4>如果父组件中加了v-slot:default属性,则此处的未具名插槽只匹配父组件中template中有v-slot:default属性的内容</h4>
    <h4>如果父组件中未加v-slot:default属性,则这个slot可以用来匹配父组件中除具名插槽以外的内容</h4>
    <slot>这个slot可以用来匹配具名插槽以外的内容</slot>
    <footer>
      <slot name="footer">{{defaultFooter}}</slot>
    </footer>
  </div>
</template>

<script>
    export default {
        name: "UseSoltTwo",
        data() {
            return {
              defaultHeader: '这是头部默认的内容',
              defaultMain: '这是主体默认的内容',
              defaultFooter: '这是底部默认的内容',
            }
        },
        methods: {}
    }
</script>

<style scoped>

</style>

//这是第三种用法的子组件
<template>
  <div>
    <h3>这是slot的第三种用法,此用法可以让父组件访问子组件中的数据</h3>
      <span>
        <slot v-bind:user="user">
          {{ user.lastName }}
        </slot>
      </span>
  </div>
</template>

<script>
  export default {
    name: "UseSlotThree",
    data() {
      return {
        user: {
          firstName: '重',
          lastName: '庆',
          fullName: '重 庆'
        }
      }
    },
    methods: {}
  }
</script>

<style scoped>

</style>

有不对的地方还请指出!以免误导大家,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值