网站是公司域名是个人可以吗,h5开发教程,网站论文参考文献,南昌网站建设有限公司走在前端的大道上
插槽#xff0c;也就是slot#xff0c;是组件的一块HTML模板#xff0c;这块模板显示不显示、以及怎样显示由父组件来决定。 实际上#xff0c;一个slot最核心的两个问题在这里就点出来了#xff0c;是显示不显示和怎样显示。
由于插槽是一块模板…走在前端的大道上
插槽也就是slot是组件的一块HTML模板这块模板显示不显示、以及怎样显示由父组件来决定。 实际上一个slot最核心的两个问题在这里就点出来了是显示不显示和怎样显示。
由于插槽是一块模板所以对于任何一个组件从模板种类的角度来分其实都可以分为非插槽模板和插槽模板两大类。
非插槽模板指的是html模板比如‘div、span、ul、table’这些非插槽模板的显示与隐藏以及怎样显示由组件自身控制
插槽模板是slot它是一个空壳子因为它的显示与隐藏以及最后用什么样的html模板显示由父组件控制。但是插槽显示的位置确由子组件自身决定slot写在组件template的什么位置父组件传过来的模板将来就显示在什么位置。
单个插槽 | 默认插槽 | 匿名插槽
首先是单个插槽单个插槽是vue的官方叫法但是其实也可以叫它默认插槽或者与具名插槽相对我们可以叫它匿名插槽。因为它不用设置name属性。
单个插槽可以放置在组件的任意位置但是就像它的名字一样一个组件中只能有一个该类插槽。相对应的具名插槽就可以有很多个只要名字name属性不同就可以了。 下面通过一个例子来展示。
父组件
templatediv classfatherh3这里是父组件/h3childdiv classtmplspan菜单1/spanspan菜单2/spanspan菜单3/spanspan菜单4/spanspan菜单5/spanspan菜单6/span/div/child/div
/template
子组件
templatediv classchildh3这里是子组件/h3slot/slot/div
/template
在这个例子里因为父组件在里面写了html模板那么子组件的匿名插槽这块模板就是下面这样。也就是说子组件的匿名插槽被使用了是被下面这块模板使用了。
div classtmplspan菜单1/spanspan菜单2/spanspan菜单3/spanspan菜单4/spanspan菜单5/spanspan菜单6/span
/div
最终的渲染结果如图所示 注所有demo都加了样式以方便观察。其中父组件以灰色背景填充子组件都以浅蓝色填充。
具名插槽
匿名插槽没有name属性所以是匿名插槽那么插槽加了name属性就变成了具名插槽。具名插槽可以在一个组件中出现N次出现在不同的位置。下面的例子就是一个有两个具名插槽和单个插槽的组件这三个插槽被父组件用同一套css样式显示了出来不同的是内容上略有区别。
父组件
templatediv classfatherh3这里是父组件/h3childdiv classtmpl slotupspan菜单1/spanspan菜单2/spanspan菜单3/spanspan菜单4/spanspan菜单5/spanspan菜单6/span/divdiv classtmpl slotdownspan菜单-1/spanspan菜单-2/spanspan菜单-3/spanspan菜单-4/spanspan菜单-5/spanspan菜单-6/span/divdiv classtmplspan菜单-1/spanspan菜单-2/spanspan菜单-3/spanspan菜单-4/spanspan菜单-5/spanspan菜单-6/span/div/child/div
/template
子组件
templatediv classchild// 具名插槽slot nameup/sloth3这里是子组件/h3// 具名插槽slot namedown/slot// 匿名插槽slot/slot/div
/template 可以看到父组件通过html模板上的slot属性关联具名插槽。没有slot属性的html模板默认关联匿名插槽。
作用域插槽 | 带数据的插槽
最后就是我们的作用域插槽。这个稍微难理解一点。官方叫它作用域插槽实际上对比前面两种插槽我们可以叫它带数据的插槽。什么意思呢就是前面两种都是在组件的template里面写
匿名插槽
slot/slot
具名插槽
slot nameup/slot
但是作用域插槽要求在slot上面绑定数据。也就是你得写成大概下面这个样子。
slot nameup :datadata/slotexport default {data: function(){return {data: [zhangsan,lisi,wanwu,zhaoliu,tianqi,xiaoba]}},
}
我们前面说了插槽最后显示不显示是看父组件有没有在child下面写模板像下面那样。
childhtml模板
/child
写了插槽就总得在浏览器上显示点东西东西就是html该有的模样没写插槽就是空壳子啥都没有。 OK我们说有html模板的情况就是父组件会往子组件插模板的情况那到底插一套什么样的样式呢这由父组件的htmlcss共同决定但是这套样式里面的内容呢
正因为作用域插槽绑定了一套数据父组件可以拿来用。于是情况就变成了这样样式父组件说了算但内容可以显示子组件插槽绑定的。
我们再来对比作用域插槽跟单个插槽和具名插槽的区别因为单个插槽和具名插槽不绑定数据所以父组件提供的模板一般要既包括样式又包括内容上面的例子中你看到的文字“菜单1”“菜单2”都是父组件自己提供的内容而作用域插槽父组件只需要提供一套样式在确实用作用域插槽绑定的数据的前提下。
下面的例子你就能看到父组件提供了三种样式(分别是flex、ul、直接显示)都没有提供数据数据使用的都是子组件插槽自己绑定的那个数组一堆人名的那个数组。
父组件
templatediv classfatherh3这里是父组件/h3!--第一次使用用flex展示数据--childtemplate slot-scopeuserdiv classtmplspan v-foritem in user.data{{item}}/span/div/template/child!--第二次使用用列表展示数据--childtemplate slot-scopeuserulli v-foritem in user.data{{item}}/li/ul/template/child!--第三次使用直接显示数据--childtemplate slot-scopeuser{{user.data}}/template/child!--第四次使用不使用其提供的数据, 作用域插槽退变成匿名插槽--child我就是模板/child/div
/template
子组件
templatediv classchildh3这里是子组件/h3// 作用域插槽slot :datadata/slot/div
/templateexport default {data: function(){return {data: [zhangsan,lisi,wanwu,zhaoliu,tianqi,xiaoba]}}
}
结果如图所示