Vue——slot的含义是什么, slot之详细解释

  • Post author:
  • Post category:vue


slot 英文的意思是“插槽”的意思,vue用这个词做标签,意思是能够在这个标签里插入一些东西,是由调用组件(父组件)向其调用的子组件里插入一些东西的一个解决办法。

slot的语法如下:

<slot></slot>

以上这段代码是书写在需要支持插入能力的子组件里的,有了这段标签代码后,子组件就支持父组件向其内部插入东西了。

一个支持slot的子组件的模板html如下:

<template>
  <div class="slot-child">
      <div><slot>在这个地方可以调用者可以插入东西</slot></div>
      <span>子组件里的其它内容</span>
      <span>{{ message }}</span>
  </div>
</template>

<script>
export default {
  name: 'subcomponent',
  data () {
    return {
      message: "我自己的消息"
    }
  }
}
</script>

调用subcomponent组件的符组件如果需要在子组件里面插入一些东西,父组件必须在调用子组件的地方输入标签,即在子组件的名称标签里写标签或文本内容。

一个父组件的样本代码如下:

<template>
  <div class="slots">
      <div>父组件自己的内容</div>
      <!-- subcomponent 标签之间的内容将插入到子组件的slot标签里  -->
      <subcomponent>
          <div class="no-name">这个文字将会插入到子组件里</div>
      </subcomponent>
  </div>
</template>

<script>
import subcomponent from 'component/Subcomponent'
export default {
    name: 'caller',
    components:{
        subcomponent
    },
    data () {
        return {
      
        }
    }
}
</script>

可以在子组件里书写多个slot标签,如果这些slot标签不添加name属性,则就是说这些slot不具有名称,这些slot插槽将插入父组件调用子组件时书写在子组件标签中没有 slot的标签的内容。

一个具名子组件的样本如下:

<div class="sub-item">
    <slot>
        <p>如果父组件没用插入内容,我将作为默认出现</p>
    </slot>
    <div>
    <slot name="xxx">
         <p>如果父组件没用插入内容,我将作为默认出现xxx</p>
    </slot>
    </div>
</div>

父组件的调用具名slot的子组件的代码如下:

<div class="my">我自己的东西</div>
    <child-component>
    <p>插入到子组件里的内容,不具名</p>
			
    <p slot="xxx">插入到子组件XXX slot里的内容</p>
    <p>插入到子组件里的内容,不具名0000</p>
    <p>插入到子组件里的内容,不具名2222</p>
</child-component>

一个包含具名slot的单文件slot的测试样本如下

这是一个独立的完整文件,可以直接复制->粘贴->另存为文件到web目录下做测试:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Vue之slot示例</title>
</head>
<body>
    <div id="app">
		<div class="my">调用组件自己的东西</div>
		<!-- 子组件child-component标签内 没有任何内容 -->
		<child-component></child-component>
		
        <!-- 子组件child-component标签内 有内容,将插入到子组件的slot处 -->
        <child-component>
            <p>插入到子组件里的内容,不具名</p>
			<!-- 将插入到子组件的具名xxx的slot处 -->
			<p slot="xxx">插入到子组件具名xxx的slot里的内容</p>
			<p>插入到子组件里的内容0000,不具名</p>
			<p>插入到子组件里的内容2222,不具名</p>
        </child-component>
		
		<child-component2>
            <p>插入到子组件里的内容2</p>
			
			<p slot="xxx">插入到子组件XXX slot里的内容2</p>
        </child-component2>
    </div>
    
    <script src="https://unpkg.com/vue/dist/vue.min.js"></script>

    <script>

        Vue.component('ChildComponent', {
            template: '\
            <div class="sub-item">\
                <slot>\
                    <p>父组件调用我时标签内没用插入任何内容</p>\
                </slot>\
				<div><slot name="xxx">\
                    <p>父组件调用我时没有 slot="xxx" 的标签或者标签内没用插入任何内容</p>\
                </slot></div>\
            </div>'
        });

		Vue.component('ChildComponent2', {
            template: '\
            <div class="sub-item">\
                <slot>\
                    <p>父组件调用我时标签内没用插入任何内容</p>\
                </slot>\
				<slot name="xxx">\
                    <p>父组件调用我时没有 slot="xxx" 的标签或者标签内没用插入任何内容</p>\
                </slot>\
            </div>'
        });
		
        var app = new Vue({
            el: '#app'
        })

    </script>
	<style>
	.sub-item {
		border: 1px solid #ccc;
		padding: 20px 30px;
		margin: 20px;
	}
	
	.my {
		border: 1px solid #ddd;
		padding: 10px 30px;
		margin: 10px 20px;
	}
	</style>
</body>
</html>

如果没有指定默认的匿名slot, 父组件调用子组件时子组件名称标签标签内的内容片段都将被丢弃。



版权声明:本文为ababab12345原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。