背景
最近的新需求需要增加一个页面,其结构和之前开发的页面差不多,当时虽然也对每一列进行了抽离,但是不够彻底,还是与业务紧耦合的,鉴于时间比较充分且抱着学习setup标签使用的态度,故而重新进行抽离设计
![](https://img.haomeiwen.com/i22517122/7d625bb9cb4ec338.png)
知识点
defineEmits、defineProps、reactive、useSlots、onMounted、defineExpose、ref
思路梳理
提取scroll组件只用于处理分页、暂无数据和点击高亮
在scroll组件上封装train组件,用于处理弹窗业务
在业务组件中通过插槽将左侧文字和右侧按钮透传下去
代码实现
scroll
对data数组传入的值做约束,要求必须包含id属性以避免渲染出错和处理点击高亮
![](https://img.haomeiwen.com/i22517122/97f17d08125c5ee0.png)
利用element-plus的el-scrollbar组件做分页处理,并对外抛出分页请求
![](https://img.haomeiwen.com/i22517122/1f767c10d9ffac48.png)
预留插槽,等待外部传入渲染
![](https://img.haomeiwen.com/i22517122/31b3b133d4c7d925.png)
train
数据获取
定义api属性,从外部取回数据
![](https://img.haomeiwen.com/i22517122/fbabf968b2df9e4f.png)
在分页和onMounted时进行调用
![](https://img.haomeiwen.com/i22517122/9422707c77ced718.png)
弹窗处理
将弹窗的响应对外抛出
![](https://img.haomeiwen.com/i22517122/8ffa52aeebc2e733.png)
由于emit不支持返回值,故需要defineExpose将对应的内部函数对外抛出,比如,在外部处理完确认新增后关闭弹窗
![](https://img.haomeiwen.com/i22517122/581f67bb36422d44.png)
插槽转发
使用useSlots获取插槽内容
![](https://img.haomeiwen.com/i22517122/08ca44115eb159e1.png)
配合v-for将插槽转发给scroll组件
![](https://img.haomeiwen.com/i22517122/0c8538644e667ea2.png)
业务逻辑
通过template给对应的插槽填入内容并获取当前行的data数据
![](https://img.haomeiwen.com/i22517122/843d7a379a3c0f8b.png)
利用ref获取在train中通过defineExpose出的接口,并在合适的时机做调用
![](https://img.haomeiwen.com/i22517122/e6497b1b7dc656b2.png)
网友评论