Slot 通俗理解就是‘占坑’,在组件模板中占好了位置,当使用该组件标签时候,组件标签里面的内容就会自动填坑(替换组件模板中slot位置)
并且可以作为承载分发内容的出口
定义两个组件 home.vue、test.vue
然后在home.vue组件中引用test.vue组件
- //home.vue
- <test>
- Hello Word
- test>
-
-
- //test.vue
- <a href="#">
- <slot>slot>
- a>
当组件渲染的时候,
在你的 index.html 引用 Font Awesome 图标的样式就直接可以用那里面的图标了
- //home.vue
- <test>
-
- <span class="fa fa-user">span>
- Hello Word
- test>
- //home.vue
- <test>
-
- <font-awesome-icon>font-awesome-icon>
- Hello Word
- test>
如果
在插槽中使用数据
插槽跟模板其他地方一样都可以访问相同的实例属性(也就是相同的"作用域"),而不能访问
- //home.vue
- //这里是获取不到name的,因为这个值是传给<test>的
- <test name='you'>
- Hello {{name}}
- test>
-
- <script>
- //插槽可以获取到home组件里的内容
- Hello {{enhavo}}
-
- data(){
- return{
- enhavo:'word'
- }
- }
- script>
规则:父级模板里的所有内容都是在父级作用域中编译的;子模板里的所有内容都是在子作用域中编译的。
有时候我们需要给插槽设置一个具体的默认内容,当别的组件没有给你内容的时候,那么默认的内容就会被渲染
- //test.vue
- //在slot插槽里设置默认内容 Submit
- <button>
- <slot>Submitslot>
- button>
在home.vue里直接使用test.vue如下:
- //home.vue
- <test>test>
那么最后设置的默认内容 Submit 将会被渲染
- <button>
- Submit
- button>
假如我们提供内容呢?
- //home.vue
- <test>按钮test>
那么这个提供的内容将会替代默认的内容被渲染出来
- <button>
- 按钮
- button>
有时候我们一个组件里需要多个插槽对于这样的情况,元素有一个特殊的特性:name ,这个特性可以用来定义额外的插槽
- <div>
- <header>
-
- header>
-
- <main>
-
- main>
-
- <footer>
-
- footer>
- div>
这时候,我们就可以使用name属性
- <div>
- <header>
- <slot name="header">slot>
- header>
-
- <main>
- <slot>slot>
- main>
-
- <footer>
- <slot name="footer">slot>
- footer>
- div>
如果一个不带name属性的话,那么它的name默认为default
在向具名插槽提供内容的时候,我们可以在元素上使用v-slot指令,并以参数的形式提供其名称
- <div>
- <template v-slot:header>
- <h1>Here might be a page titleh1>
- template>
-
- <p>A paragraph for the main content.p>
- <p>And another one.p>
-
- <template v-slot:footer>
- <p>Here some contact infop>
- template>
- div>
现在 元素中的所有内容都将会被传入相应的插槽。任何没有被包裹在带有 v-slot 的 中的内容都会被视为默认插槽的内容。
如果你希望更明确一点的话,那就把主体内容那个插槽里设置name="default",然后把上面的内容包裹起来
- :default>
- <p>A paragraph for the main content.p>
- <p>And another one.p>