高级列表组件ReList

高级列表组件ReList

组件实现基于 Vue3 + Element Plus + Typescript,同时引用 vueUse + lodash-es + tailwindCss (不影响功能,可忽略)

主要基于JSX风格实现高度动态的列表渲染组件,可以通过信息配置Metas配置控制信息项展示,同时支持render函数自定义渲染。

提供两种风格的List展示方式,以及两种布局方式,再搭配Metas配置,可以实现多种多样的List展示方式,能够满足日常80%的展示方式。

基于这个列表组件,扩展了分页列表,滚动加载列表,虚拟列表等应用组件。

思路

基于Vue3 对 JSX(TSX)的支持,利用JSX的高度动态渲染方式,进行List项的渲染。将每个列表项信息的渲染独立成一个JSX渲染,然后根据布局控制每个信息的展示顺序来实现一个高度动态的列表。

其次,通过metas配置控制列表信息项的展示,只有需要展示才进行渲染,同时支持自定义render渲染,基于vue3的h方法,除次之外,提供作用域插槽用于整个列表项的自定义渲染(只有组件不满足您想要的时候在考虑)。

基础

通过 metas 字段配置列表项展示内容。支持配置列表项内容对于的数据字段,自定义渲染,绑定事件,自定义样式类。

在这里插入图片描述

查看 /demo/list/basic.md

可选择

设置 checkable 字段开启列表可选中,支持绑定 checks 获取当前的选中列表,需要指定 rowKey 字段指定绑定值

在这里插入图片描述

查看 /demo/list/checkable.md

可展开

设置 expandable 字段开启列表项展开控制,默认会隐藏 content/description 内容信息。试着改变布局观察不同效果。

在这里插入图片描述

查看 /demo/list/expandable.md

自定义操作列

通过 metas 字段配置 actions 可以自定义操作按钮组渲染。actions的配置与其他几个内容字段配置有些差别,注意区分

在这里插入图片描述

查看 /demo/list/actions.md

垂直布局

通过 itemLayout 字段指定列表项的布局展示,type=list 和 type=card 均支持。试着改变布局观察不同效果。

在这里插入图片描述

在这里插入图片描述

查看 /demo/list/layout.md

列表页头/页脚

通过 title 属性或者 title / extra 插槽控制列表页头展示,通过 footer 插槽自定义列表页脚展示。

在这里插入图片描述

查看 /demo/list/header.md

卡片列表

设置 type=card 切换列表展示风格。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

查看 /demo/list/card.md

响应网格卡片列表

卡片列表支持多列展示,能够更好的满足卡片布局风格。可以通过 grid 指定网格列数,每个卡片列表项默认占1格(不可改)。

在这里插入图片描述

查看 /demo/list/grid.md

卡片操作列

卡片风格的列表,操作按钮组支持调整显示位置。可以设置 action-positioncard-footer 将操作按钮组放置在卡片页脚位置,这是一种常见的布局展示方式。
在这里插入图片描述

在这里插入图片描述

查看 /demo/list/card-footer.md

自定义渲染

metas 字段配置展示内容,支持自定义render函数实现自定义渲染,但有时候我们需要整个列表项都自定义时,使用render函数渲染比较麻烦,可以通过default默认插槽实现自定义渲染。default插槽作为作用域插槽,支持item、metas两个作用域参数字段。

在这里插入图片描述

查看 /demo/list/slot-scoped.md

ReList属性

字段说明类型默认值
items必填,列表项数据集Record<string, any>[]-
metas必填,列表项展示配置ReListItemMetas-
title列表标题string-
checks(v-model)绑定勾选值Array<string | number>-
rowKey列表项主键,作为modelValue绑定值string“id”
split是否显示分割线booleantrue
border是否显示边框booleanfalse
loading加载状态booleanfalse
rowClassName自定义列表项样式类string-
customClass自定义List容器样式类string-
hover是否显示悬浮样式booleantrue
expandable是否可展开,仅在type="list"下有效booleanfalse
checkable是否可选,不同列表风格下交互不同booleanfalse
ghost是否去掉内边距booleanfalse
type列表类型“card” | “list”“list”
grid响应网格,仅在type="card"下有效number | ReGridResponsive1
gutter网格间距,仅在type="card"下有效number | [number] | [number, number]16
action-position附加操作栏位置,仅在type="card"下有效“default” | “card-footer”“default”
avatar-position头像展示位置“left” | “right”“left”
avatarHideInExpanded是否在折叠时隐藏头像booleantrue
itemLayout列表项布局“vertical” | “horizontal”“horizontal”
itemHeight列表项高度,内容溢出被隐藏number-

ReListItemMetas 展示配置

有指定字段则会展示对应信息项

字段说明类型
avatar头像,未指定则不显示ReListItemMeta
title标题,未指定则不显示ReListItemMeta
subTitle副标题,未指定则不显示ReListItemMeta
content正文,未指定则不显示ReListItemMeta
description描述文本,未指定则不显示ReListItemMeta
actions配置操作列,未指定则不显示ReListItemAction[]

types 类型声明:

export interface ReListItemMetas {
  avatar?: ReListItemMeta; // 头像
  title?: ReListItemMeta; // 标题
  subTitle?: ReListItemMeta; // 副标题
  content?: ReListItemMeta; // 正文
  description?: ReListItemMeta; // 描述
  actions?: ReListItemAction[]; // 操作列配置
}

export interface ReListItemAction {
  text?: string; // 操作按钮显示文本
  props?: Partial<ButtonProps>; // 按钮属性
  render?: (item: ReListItemProps["item"], expanded?: boolean) => VNode; // 自定义渲染函数
  events?: ReListItemMeta["events"]; // 绑定事件
}

export interface ReListItemMeta {
  dataIndex?: string; // 数据索引字段,默认按照ReListItemMetas键名
  customClass?: string; // 自定义样式类
  style?: string; // 自定义样式
  render?: (item: ReListItemProps["item"], expanded?: boolean) => VNode; // 自定义渲染函数
  events?: Record<string, Function>; // 绑定事件
}

ReList事件

事件名说明格式 |
update:checks已选中列表发生变化时触发(checks: Array<string | number>) => void
check点击某个复选框时触发(checked: boolean, id: string | number, item: Record<string, any>) => void

ReList插槽

插槽名说明
default列表项作用域插槽,带有 item、metas 两个作用域变量
titleList页头标题插槽
extraList页头额外信息插槽
footerList页脚插槽

源代码

Github

可以通过查看具体实现,如果遇到问题可以留言或者提出issue。

如果觉得对您有帮助的话,可以请小编瑞一下

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

iWangsd

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值