新版的solt的使用


2019-8-31 vue

一、普通插槽

<template>
  <div class="slot-demo">
    <slot>this is slot default content text.</slot>
  </div>
</template>
1
2
3
4
5

然后我们直接使用,页面则正常显示一下内容

this is slot default content text.
1

然后,这个时候我们使用的时候,对 slot 内容进行覆盖

<slot-demo>this is slot custom content.</slot-demo>
1

内容则变成如下所示

this is slot custom content.
1

二、具名插槽

<template>
  <div class="slot-demo">
    <slot name='demoA'>我只欢迎name为demoA的.</slot>
    <slot>this is slot default content text.</slot>
  </div>
</template>
1
2
3
4
5
6

然后我们直接使用,页面则正常显示一下内容

我只欢迎name为demoA的.
this is slot default content text.
1
2

然后,这个时候我们使用的时候,对 slot 内容进行覆盖

<slot-demo>
<div solt='demoA'>我就是slot的name为demoA要的数据</div>
this is slot custom content.
</slot-demo>
1
2
3
4

内容则变成如下所示

我就是slot的name为demoA要的数据
this is slot custom content.
1
2

三、作用域插槽

先来个相关的例子

先这样

<template>
  <div class="slot-demo">
    <slot text="this is a slot demo , " :msg="msg"></slot>
  </div>
</template>

<script>
export default {
  name: 'SlotDemo',
  data () {
    return {
      msg: 'this is scoped slot content.'
    }
  }
}
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

然后再这样

<template>
  <div class="parent-slot">
    <slot-demo>
      <template slot-scope="scope">
        <p>{{ scope.text }}</p>
        <p>{{ scope.msg }}</p>
      </template>
    </slot-demo>
  </div>
</template>
1
2
3
4
5
6
7
8
9
10

最后这样

this is a slot demo
this is scoped slot content.
1
2

从使用层面我们能看出来,子组件的 slot 标签上绑定了一个 text 以及 :msg 属性。然后父组件在使用插槽使用了 slot-scope 属性去读取插槽带的属性对应的值,这样也类似于子组件向父组件传值;

四、v-slot

vue 2.6.x 已经出来有一段时间了,其中对于插槽这块则是放弃了 slot-scope 作用域插槽推荐写法,直接改成了 v-slot 指令形式的推荐写法(当然这只是个语法糖而已);

看下面例子

<template>
  <div class="slot-demo">
    <slot name="demo">this is demo slot.</slot>
    <slot text="this is a slot demo , " :msg="msg"></slot>
  </div>
</template>

<script>
export default {
  name: 'SlotDemo',
  data () {
    return {
      msg: 'this is scoped slot content.'
    }
  }
}
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

然后进行使用

<template>
  <slot-demo>
    <template v-slot:demo>this is custom slot.</template>
    <template v-slot="scope">
      <p>{{ scope.text }}{{ scope.msg }}</p>
    </template>
  </slot-demo>
</template>
1
2
3
4
5
6
7
8

显示

this is demo slot.

this is a slot demo ,this is scoped slot content.
1
2
3

看着好 easy 。

Thomas: 10/11/2019, 3:14:55 PM