首页 > 技术文章 > Vue2.x-插槽slot用法

jwyblogs 2021-02-27 09:48 原文

指令:

  v-shot

说明:

  插槽就是子组件中的提供给父组件使用的一个占位符,用<slot></slot> 表示,父组件可以在这个占位符中填充任何模板代码,如 HTML、组件等,填充的内容会替换子组件的<slot></slot>标签

使用示例

子组件:
<template>
    <div>
        <button>
            <slot>子组件自定义按钮</slot>
        </button>
    </div>
</template>

父组件引入使用:
<template>
    <div>
        <TButton></TButton>
    </div>
</template>

这时页面显示:

  

 

 

 当父组件未传任何内容时,则默认编译子组件中的内容。

 如果在父组件使用时自定义内容,则展示父组件定义的内容:

<template>
    <div>
        <TButton>父组件定义按钮</TButton>
    </div>
</template>

页面展示:

  

具名插槽

  在slot标签上增加name属性,使用时,则需指定name,否则不生效,示例:

子组件:
<template>
    <div>
        <button>
            <slot name="text">子组件自定义按钮</slot>
        </button>
    </div>
</template>

父组件引入使用:
    <template>
    <div>
        <TButton>
            <template v-slot:text>
                父组件定义按钮
            </template>
        </TButton>
    </div>
</template>

注意:v-slot只能写在template标签上面

具名插槽缩写

  将v-slot替换成#,示例:

<template>
    <div>
        <TButton>
            <template #text>
                父组件定义按钮
            </template>
        </TButton>
    </div>
</template>

  如果没有名称,简写时也要带上default,示例:

子组件:
    <template>
    <div>
        <button>
            <slot>子组件自定义按钮</slot>
        </button>
    </div>
</template>

父组件引入使用:
    <template>
    <div>
        <TButton>
            <template #default>
                父组件定义按钮
            </template>
        </TButton>
    </div>
</template>

作用域插槽:

  作用域插槽就是父组件插槽获取子组件中的数据,示例:

子组件定义:
<template>
    <div>
        <button>
            <slot key1="value1" key2="value2">子组件自定义按钮</slot>
        </button>
    </div>
</template>

父组件获取子组件的数据:
<template>
    <div>
        <TButton>
            <template #default="childValue">
                父组件定义按钮
                <br />
                {{ childValue }}
            </template>
        </TButton>
    </div>
</template>
    

  页面展示:

  

 

 

   其中childValue是自定义的名称,childValue作为子组件所有数据的key,使用数据则以childValue.key1形式

  对应老版本使用则是slot-scope="childValue"

 

具名插槽+作用域插槽不简写使用示例:

子组件:
    <template>
    <div>
        <button>
            <slot name="text" key1="value1" key2="value2">子组件自定义按钮</slot>
        </button>
    </div>
</template>

父组件:
    <template>
    <div>
        <TButton>
            <template v-slot:text="childValue">
                父组件定义按钮
                <br />
                {{ childValue }}
            </template>
        </TButton>
    </div>
</template>

使用多个插槽示例:

子组件:
<template>
    <div>
        <div>
            <slot name="header" text="我是header">header</slot>
            <slot name="main" text="我是main">main</slot>
            <slot name="footer" text="我是footer">footer</slot>
        </div>
    </div>
</template>

父组件:
    <template>
    <div>
        <TMain>
            <template #header="headerValue">
                <div class="header">
                    {{ headerValue.text }}
                </div>
            </template>
            <template #main="mainValue">
                <div class="main">
                    {{ mainValue.text }}
                </div>
            </template>
            <template #footer="footerValue">
                <div class="footer">
                    {{ footerValue.text }}
                </div>
            </template>
        </TMain>
    </div>
</template>

注意:

  :后面是插槽的名称

  =后面是父组件获取子组件的数据  

  #是v-slot的缩写  #default    #text  ===  v-slot:text     对应老版本写法: slot="text"

  v-slot和#只能写在template标签上面

 

 

  

推荐阅读