0
点赞
收藏
分享

微信扫一扫

vue作用域插槽,你真的懂了吗?

時小白 2022-04-29 阅读 77
  • 最难理解的是作用域插槽。看了文档说明的朋友可能还会有点晕,大概是说在作用域插槽内,父组件可以拿到子组件的数据。子组件可以在slot标签上绑定属性值,如:

而父组件通过slot-scope绑定的对象下拿到nickName的值。

{{scope.nickName}}

这里大家应该都有疑问。这有什么用?我在子组件用$emit向父组件传递数据不就行了?

[](()关于作用域插槽的一点理解

==============================================================================

我觉得要从组件之间的数据流向来思考作用域插槽的应用场景。

淘宝商品列表

我会使用如下的处理方式,首先将商品卡片写成一个组件Commodity.vue,而在CommodityList.vue中用一个v-for来处理商品卡片列表的展示。

<commodity v-for=“(item,index) in commodities” @clickCommodity=“onCommodityClick”>

Commodity组件通过$emit像父组件传递clickCommodity事件,并携带商品数据,父组件即可在onCommodityClick方法中得到数据,进行业务处理,这样便完成了一个基本的由子到父的数据传递。

淘宝运营栏目列表

注意:业务来了,我希望把点击商品卡片的业务放在ColumnList.vue中处理。你们想象一下要怎么做?一种土办法就是商品按钮点击时,Commodity组件 e m i t 通 知 C o m m o d i t y L i s t . v u e , 而 C o m m o d i t y L i s t 接 着 把 事 件 用 emit通知CommodityList.vue,而CommodityList接着把事件用 emitCommodityList.vueCommodityListemit往上抛,那么ColumnList.vue就能处理这个点击事件了。这样做完全没有问题,但是显得子组件很不纯粹,跟业务都扯上关系了。

那么如何优雅地解决这个问题呢?这个时候,作用域插槽真正派上用场了。

通过作用域插槽将本应该由CommodityList处理的商品卡片点击业务onCommodityClick提升到ColumnList处理。

{{column.columnName}}

<commodity :modityData=“scope.row” @clickCommodity=“onCommodityClick(scope.row)”>

而CommodityList组件内部应该是改造成这样,slot接收来自父组件的商品卡片组件,这里面不涉及关于商品组件的业务,只关注其他业务和布局即可。最终就实现了组件和业务的剥离,这也是组件化的精髓所在吧。不知道有没有帮到您呢?

举报

相关推荐

0 条评论