vuejs 插槽和作用域插槽

简单记录一下

1.简单插槽

简单来说:组件最外层的html是一样的,里面的内容随便你填写。<slot></slot>(此标签是必须写的)对应的是Your Profile内容,或者你想填的任何内容

.html代码

<div id="components-demo">
    <navigation-link url="/profile">
      Your Profile
    </navigation-link>
</div>

.js代码

 

Vue.component('navigation-link', {
  props:["url"],
  template: `
    <a
        v-bind:href="url"
        class="nav-link">
        <slot></slot>
    </a>
  `
})

new Vue({
  el: '#components-demo'
 })

结果如下图

2.作用域插槽

简单来说,如果你想要组件循环出不一样的html,你就可以用作用域插槽来实现。其中slot-scope 对应的就是js中的slot标签内容

.html代码

  <div id="components-demo">
      <my-list title="形状" :items="shapes">
          <div slot-scope="vv">{{vv.name}}<small>({{vv.sides}}条边)</small></div>
      </my-list>

      <my-list title="颜色" :items="colors">
          <div slot-scope="ad">
              <div class="colorbox" :style="{background:ad.hex}">{{ad.name}}</div>
          </div>
      </my-list>

    </div>

.js代码

Vue.component('my-list', {
  props:["title","items"],
  template: `
  <div class="my-list">
              <h3 class="title">{{title}}</h3>
              <div class="list">
                  <slot v-bind="item" v-for="item in items"></slot>
              </div>
          </div>
  `
})

new Vue({
  el: '#components-demo',
  data:{
      shapes:[{ name:'正方形', sides:4},{ name:'六边形', sides:6},{ name:'三角形', sides:3}],
      colors:[{ name: '黄色', hex: '#f4d03f' },{ name: '绿色', hex: '#229954' },{ name: '紫色', hex: '#9b59b6' }]
    }
 })

父组件模板的所有东西都会在父级作用域内编译;子组件模板的所有东西都会在子级作用域内编译。

 

https://www.w3cplus.com/vue/vue-js-scoped-slots.html 此网站的作者将的更为详细

Vue2中的插槽分为默认插槽、具名插槽作用域插槽三种类型。 默认插槽是指没有被包裹在具名插槽中的内容,可以通过在父组件中使用<slot>标签来使用默认插槽。 具名插槽是指被包裹在<template>标签中,并且带有name属性的内容。可以在父组件中使用<slot>标签的name属性来使用具名插槽作用域插槽是指可以将子组件中的数据传递到父组件中进行处理的插槽。可以通过在子组件中使用<slot>标签,并且在标签中使用slot-scope属性来定义作用域插槽。在父组件中使用<template>标签,并且在标签中使用v-slot属性来使用作用域插槽。 下面是一个使用具名插槽作用域插槽的例子: ```html <!-- 子组件 --> <template> <div> <h2>子组件</h2> <slot name="header"></slot> <ul> <li v-for="item in list" :key="item">{{ item }}</li> </ul> <slot name="footer" :list="list"></slot> </div> </template> <script> export default { name: 'ChildComponent', props: { list: { type: Array, default: () => [] } } } </script> <!-- 父组件 --> <template> <div> <h2>父组件</h2> <ChildComponent :list="list"> <template v-slot:header> <h3>这是子组件的头部</h3> </template> <template v-slot:footer="slotProps"> <h3>这是子组件的尾部</h3> <p>列表长度:{{ slotProps.list.length }}</p> </template> </ChildComponent> </div> </template> <script> import ChildComponent from './ChildComponent.vue' export default { name: 'ParentComponent', components: { ChildComponent }, data() { return { list: ['item1', 'item2', 'item3'] } } } </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值