vue基础 -- 插槽

一 插槽目的与作用

Vue 将 元素作为承载分发内容的出口。
插槽就是子组件中的提供给父组件使用的一个占位符,用 表示,父组件可以在这个占位符中填充任何模板代码,如 HTML、组件等,填充的内容会替换子组件的标签。
插槽,其实就相当于占位符。

二 插槽基础使用

1、在子组件中放一个占位符



2、在父组件中给这个占位符填充内容



3、展示效果


image.png

当组件渲染的时候, 将会被替换为父组件传入的内容。该内容可以包含任何模板代码,包括 HTML,甚至其它的组件。
如果子组件的 template 中没有包含一个 元素,则该组件起始标签和结束标签之间的任何内容都会被抛弃。
即 如果子组件没有使用插槽,父组件如果需要往子组件中填充模板或者html, 是没法做到的。

三 深入了解插槽使用

<1> 插槽的编译作用域

父级模板里的所有内容都是在父级作用域中编译的;子模板里的所有内容都是在子作用域中编译的。


  Clicking here will send you to: {{ url }}
  

<2> 给插槽的slot位置设置默认值

给插槽设置具体的后备 (也就是默认的) 内容,它只会在没有提供内容的时候被渲染。
例如,
某子组件中的

当在一个父级组件中使用 并且不提供任何插槽内容时,后备内容“Submit”将会被渲染
当提供内容:


  Save

则这个提供的内容将会被渲染从而取代后备内容:


<3> v-slot具名插槽与匿名插槽

跟 v-on 和 v-bind 一样,v-slot 也有缩写, 为#,即把(v-slot:) 替换为字符 #。例如 v-slot:header 可以被重写为 #header。
该缩写只在其有参数的时候才可用, 如果希望使用缩写的话,必须始终以明确插槽名取而代之。

具名插槽其实就是给插槽取个名字。一个子组件可以放多个插槽,而且可以放在不同的地方,而父组件填充内容时,可以根据这个名字把内容填充到对应插槽中。
vue给 元素定义有一个特殊的属性:name。这个属性可以用来定义插槽 (即给它取名)。

匿名插槽,又可以叫它单个插槽或者默认插槽。与具名插槽相对,它不需要设置name属性。(它隐藏的name属性为default。)

举例,
定义子组件

父组件使用插槽

父组件填充内容, 父组件通过 v-slot:[name] 的方式指定到对应的插槽中
即父组件通过在template上写v-slot:name来使用具名插槽

父组件在向具名插槽提供内容的时候,我们可以在一个