这里写一下关于Vue.js插槽的内容。之前在学习vue.js的时候就觉得这个插槽非常有意思,非常神奇,在官方文档跟一些教程的学习后,觉得有必要单独记录一下,所以这里准备了这么一篇。
插槽是什么
官方文档是这么解释的:Vue 实现了一套内容分发的 API,这套 API 基于当前的 Web Components 规范草案,将 <slot>
元素作为承载分发内容的出口。
简单的说,插槽是vue.js的一套API,是用于实现内容分发的,使用<slot>
元素做接口。
从我个人的使用理解来说,就是子组件上留了一些口,这些口就是插槽,这些口可以提供给父组件进行自定义的插入内容,包括字符串,html标签,甚至其他组件。
没有使用插槽的情况
一般来说,在没有使用插槽的情况下,或者子组件没有留插槽的情况下,父组件上在组件标签之间码下的所有内容,都会被抛弃。这也是vue.js官方文档中明确提醒的。也就是说,没有插槽,父子组件之间只有通信的操作,父组件并不能控制在子组件内展示什么内容。
插槽的实现
实现插槽不难,理解插槽就好办了。上面说了,我理解的插槽就是在子组件上留一些口,父组件引用子组件时就可以在这些口上插入内容了。因此,先要在子组件上开口:
1 | <!-- child-component --> |
这样就可以实现简单的插槽功能了。但是插槽不只是这些。插槽还分具名插槽,默认插槽。
具名插槽&默认插槽
有时候子组件不止设置一个插槽,还会设置多个插槽。而在父组件上,只能在子组件标签之后传入插槽内容。所以需要一个区分的标识。就像子组件上有多个插槽,父组件要往这些插槽上分别放内容,怎么知道哪些内容放到哪个插槽呢?这就用到<slot>
元素上的属性name
了。
1 | <!-- child-component --> |
上面的例子中就实现了默认插槽,父组件所有未指定插槽的内容都会分发到默认插槽中。
默认内容&编译作用域
不过有时候父组件不一定会用上子组件的插槽。这种情况下子组件就可以指定默认的内容。如果父组件有传入内容,指定默认的内容就会被替换掉.
1 | <main> |
如果想在插槽中使用数据,需要注意作用域的问题:插槽中的内容所在的作用域是父组件的作用域,只能访问父组件作用域内的数据,不能访问子组件作用域内的数据。
1 | <template slot="header"> |
作用域插槽
虽然插槽所使用的数据只能是父组件的作用域,但是还是有办法使用子组件的数据的,就是作用域插槽。
作用域插槽就是把子组件需要在插槽内使用的数据作为插槽的prop传入,然后父组件在插槽内的元素或组件中使用slot-scope
获取数据:
1 | <!-- 引用官方文档的例子 --> |
这里确认一点:slot-scope
不仅可以在<template>
元素上使用,还可以在插槽内的任何元素或组件上使用。另外,官方文档还说明了,基于ES2015解构语法,上面父组件中<template slot-scope="slotProps">
可以写成<template slot-scope="{ todo }">
。
以上就是关于vue.js插槽的内容。