#未命名插槽
slot未命名时,每个标签内都会生成父组件中提供的内容。
父组件app.vue

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<template>
<div id='app'>
<slottest>
<h1>Here might be a page title</h1>

<p>A paragraph for the main content.</p>
<p>And another one.</p>

<p>Here's some contact info</p>
</slottest>
</div>
</template>
<script>
import slottest from './components/slottest'
export default {
data(){
return {

}
},
components:{
slottest
}
}
</script>

子组件slottest.vue

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<template>
<div>
<slot></slot>
<slot></slot>
</div>
</template>

<script>
export default {
data(){
return {

}
}
}
</script>

<style>

</style>

渲染HTML如下
image.png
如果子组件中没有包含任何一个 元素,则任何传入它的内容都会被抛弃。

#命名插槽
父组件app.vue

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<template>
<div id='app'>
<button-counter></button-counter>
<slottest>
<h1 slot="header">Here might be a page title</h1>

<p>A paragraph for the main content.</p>
<p>And another one.</p>

<p slot="footer">Here's some contact info</p>
</slottest>
</div>
</template>
<script>
import slottest from './components/slottest'
export default {
data(){
return {

}
},
components:{
slottest
}
}
</script>

子组件slottest.vue

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<template>
<div>
<header>
<slot name="header"></slot>
</header>
<main>
<slot></slot>
</main>
<footer>
<slot name="footer"></slot>
</footer>
</div>
</template>

<script>
export default {
data(){
return {

}
}
}
</script>

<style>

</style>

渲染完后html结构
image.png
#默认内容

1
2
3
<button type="submit">
<slot>Submit</slot>
</button>

如果父组件为这个插槽提供了内容,则默认的内容会被替换掉。
#作用域插槽 | 带数据的插槽
作用域插槽要求,在slot上面绑定数据。

1
2
3
4
5
6
7
8
<slot name="up" :data="data"></slot>
export default {
data: function(){
return {
data: ['zhangsan','lisi','wanwu','zhaoliu','tianqi','xiaoba']
}
},
}

父组件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<template>
<div class="father">
<h3>这里是父组件</h3>
<!--第一次使用:用flex展示数据-->
<child>
<template slot-scope="user">
<div class="tmpl">
<span v-for="item in user.data">{{item}}</span>
</div>
</template>

</child>

<!--第二次使用:用列表展示数据-->
<child>
<template slot-scope="user">
<ul>
<li v-for="item in user.data">{{item}}</li>
</ul>
</template>

</child>

<!--第三次使用:直接显示数据-->
<child>
<template slot-scope="user">
{{user.data}}
</template>

</child>

<!--第四次使用:不使用其提供的数据, 作用域插槽退变成匿名插槽-->
<child>
我就是模板
</child>
</div>
</template>

子组件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<template>
<div class="child">

<h3>这里是子组件</h3>
// 作用域插槽
<slot :data="data"></slot>
</div>
</template>

export default {
data: function(){
return {
data: ['zhangsan','lisi','wanwu','zhaoliu','tianqi','xiaoba']
}
}
}

image.png