对React有理解的小伙伴肯定对 props.children
这个属性不生疏。其实Vue里的slot
和它的概念是差不多的。
我喜爱理解一个知识点的时候,先去查阅它的英文意思,这样真的能够帮忙咱们粗浅的了解这个办法的原意。
英语真的是十分十分重要的,然而这货色是一个细水长流缓缓积攒的过程,不可能狂补几天就能把握的。所以我倡议能够买一个本本每天记录一下本人遇到的生疏单词。因为到前面会越发感觉到英文文档的重要性,还有就是些第三方库是没有中文文档的。
注释
一.一般slot
从名字咱们就能够大抵理解,这个货色大略是用来往标签里查某些数据用的。
1.筹备两个简略的组件构建一个页面。只需看我框住的内容即可,其它中央与本篇文章内容无关。
绝对应的界面也是非常简单,款式就不贴出来了。
2.在这里咱们思考一下,凭什么区区一个原生html
标签<h1>
里就能够写内容,难到我堂堂一个Vue组件slotText
不能够写内容吗?
答案是必定能够的,咱们写一一下试试。
如同浏览器和vscode
都没有报错,好耶!
然而咱们如同快乐的太早了...
什么状况啊?我明明写内容了,我页面上的内容呢?为什么不帮我渲染呢?
3.让咱们回到slotText
组件看一下。
咱们可能潜意识的说,你间接帮我渲染到div里不就能够了吗?然而Vue
可还没智能到猜你到底想要放哪里那种水平,那万一你的意思是放在另外两处,那页面不就乱了套了吗?
4.这就须要咱们提前预留出一个坑
,通知vue咱们想要渲染到哪里。没错,非常简单,就是放一个标签slot
!
看看页面成果。
没错,就是这么简略。
二.具名插槽
1.说人话就是,slot
有了本人的名字,能够利用这个name
属性帮你更灵便的安顿本人的组件。让咱们返回App
组件。
当初,我的slotText
标签体有一个h1
标签和一个h3
标签。
2.我当初想实现上面的成果,就是我写在slotText
内的内容,能够放到我原来内容的下面和上面。
3.咱们的第一直觉就是,这还不简略?看我这样写就完事了,于是在slotText.vue
文件内这样写:
我也太聪慧了吧,我真是个蠢才啊~然而我回到页面看一下呢?
vue
如同傻傻的帮咱们渲染了两遍...
其实这样不能怪vue
,因为它不晓得你的意思到底是怎么。(就如同你永远猜不透你女朋友的心理一样)vue也很无奈啊。
4.没关系,这时候vue
给你一个锦囊,你关上,下面写到,你能够给slot
起一个名字。
接下来就是通知App
组件,你得依照我的规矩办事,在这里咱们不卖官子,间接通知大家有v-slot
这个API。那还愣着干啥,连忙着手写吧!
写到一半发现,如同飘红了,看看谬误是什么。
vue
说,这个API只能用在一个组件上,或者template
标签内,这里间接通知大家答案。须要这样写:
留神,不是等号字符串的那种书写格局。
5.看看页面成果
完满。
三.作用域插槽
这个名字不太好解释,咱们从一个需要来剖析这个意思。
1.咱们当初把组件都退回到原来的状态
2.这时候,咱们提出需要,在slotText
组件里有一个变量name
须要渲染到页面上,然而我不心愿这个变量被定义到App
组件上。再简略说一步,我可不可以把name
变量反向传给<slot>
标签呢?
3.会不会想到一个办法props
?
没错,和它十分类似。咱们在slotText.vue
文件内这样写。
当然,这个id
是我轻易起的,你还能够叫myName
4.接下来怎么在App
组件内接管呢?
这个slotProps
也能够本人定义,当然,如果你es6
的构造赋值玩的溜的话,也能够这样写。
还有,你感觉myName
这个名字不好听,也能够这样写
看不懂的盲目去温习es6
,我列出的都是罕用的办法!
这几种办法页面都能够失常展现出咱们想要的成果。
补充
让我不解的中央是,当我要传递的props
的key
如果和name
这个变量同名的话,页面没成果。
在App
组件内也不会有任何谬误提醒,太奇怪了!!!