• Slot
    • 普通的Slot
    • named slot
    • slot 的默认值

    Slot

    作为对Component的补充,Vuejs 增加了 Slot 这个功能.

    普通的Slot

    我们从具体的例子来说明。

    1. <html>
    2. <head>
    3. <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
    4. </head>
    5. <body>
    6. <div id='app'>
    7. <study-process>
    8. 我学习到了Slot 这个章节。
    9. </study-process>
    10. </div>
    11. <script>
    12. Vue.component('study-process', {
    13. data: function () {
    14. return {
    15. count: 0
    16. }
    17. },
    18. template: '<div><slot></slot></div>'
    19. })
    20. var app = new Vue({
    21. el: '#app',
    22. data: {
    23. }
    24. })
    25. </script>
    26. </body>
    27. </html>

    从上面的代码从,我们可以看到,我们先是定义了一个 component:

    1. Vue.component('study-process', {
    2. data: function () {
    3. return {
    4. count: 0
    5. }
    6. },
    7. template: '<div><slot></slot></div>'
    8. })

    在这个component的template中,是这样的:

    1. template: '<div><slot></slot></div>'

    这里就使我们定义的 slot.

    然后,我们在调用这个 component的时候,这样:

    1. <study-process>
    2. 我学习到了Slot 这个章节。
    3. </study-process>

    所以,“我学习到了Slot 这个章节。”就好像一个参数那样传入到了 component中, component 发现自身已经定义了 slot, 就会把这个字符串放到slot的位置,然后显示出来。

    如下图所示:

    slot

    named slot

    也就是带有名字的slot .

    很多时候我们可能需要多个slot. 看下面的例子:

    1. <html>
    2. <head>
    3. <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
    4. </head>
    5. <body>
    6. <div id='app'>
    7. <study-process>
    8. <p slot='slot_top'>
    9. Vuejs 比起别的框架真的简洁好多!
    10. </p>
    11. 我学习到了 Slot 这个章节。
    12. <h5 slot='slot_bottom'>
    13. 再也不怕H5 项目了~
    14. </h5>
    15. </study-process>
    16. </div>
    17. <script>
    18. Vue.component('study-process', {
    19. template: '<div>' +
    20. '<slot name="slot_top"></slot>' +
    21. '<slot></slot>' +
    22. '<slot name="slot_bottom"></slot>' +
    23. '</div>'
    24. })
    25. var app = new Vue({
    26. el: '#app',
    27. data: {
    28. }
    29. })
    30. </script>
    31. </body>
    32. </html>

    上面的代码中, 我们定义了这样的 component:

    1. Vue.component('study-process', {
    2. template: '<div>' +
    3. '<slot name="slot_top"></slot>' +
    4. '<slot></slot>' +
    5. '<slot name="slot_bottom"></slot>' +
    6. '</div>'
    7. })

    其中的 <slot name="slot_top"></slot> 就是一个named slot (具备名字的slot) ,这样,在后面对于 component的调用中:

    1. <p slot='slot_top'>
    2. Vuejs 比起别的框架真的简洁好多!
    3. </p>

    就会渲染在对应的位置了。

    slot 的默认值

    我们可以为 slot 加上默认值。这样当 “父页面” 没有指定某个slot的时候,就会显示这个默认值了。

    例如:

    1. <slot name="slot_top">这里 top slot的默认值 </slot>