继续讨论 Vue 组件设计相关的东西

我们继续以表格为例,之前讨论表格不需要封装成组件,讨论的也还算有些激烈

首先观察可以知道

  • 表格分为 head,body,footer
  • 每个区域都可能有 tr(行)th(区域标题)td(区域内容)
  • td中的内容可能不定,需要有自定义能力

很少有人注意到,th不止在thead中存在,但是实际上如果你多观察一些表格,财报?发票?

你会发现,th这样的区域标题可能出现在表格的任何地方,不仅仅是列

这就给视图封装带来了负担,比如你分成几个视图组件,要在精确修改某一行列的情况下还要保证响应性,是非常困难的

所以这种问题我们不妨先放弃视图封装,仅仅从数据model的角度考虑问题


表格 - 行/列

由于表格数据在结构上都是行不同,列重复的,因此我们可以这样限定:

dataSource: 行数据源

columns:列相关配置和渲染结构

那么,dataSource作为数据源自不必说,我们来设计 columns 的数据结构

type TdRender<T> = (item: T, index: number) => JSX.Element;export interface TableColumn<T> {dataIndex?: string;header: string | JSX.Element;content: TdRender<T> | string;selected?: boolean;hidden?: boolean;order?: number;
}

每个属性都象征着特定功能,header渲染列标题,头部,content渲染body中的 td 和 th,selected表示选择,hidden表示该列是否显示,order表示列排序

可不用管什么响应式,先做出一个类来:

export default class<T extends { [key: string]: any }> {dataSource: T[] = [];columns: TableColumn<T>[] = [];// operateddisplayColumns: TableColumn<T>[] = [];// change ordercurrentOrderKey: string;changeOrder = (key: string, desc = true) => {this.displayColumns.sort((pre, next) => {if (pre[key] > next[key]) {return desc ? -1 : 1;} else if (pre[key] == next[key]) {return 0;} else if (pre[key] < next[key]) {return desc ? 1 : -1;}});this.currentOrderKey = key;};/*** hide/show column**/toggleSomeContent = (dataIndexs: string[], show = true) => {for (let item of this.columns) {if (dataIndexs.includes(item.dataIndex)) {item.hidden = show;}}this.displayColumns = this.columns.filter((el) => !el.hidden);};constructor(dataSource: T[], columns: TableColumn<T>[]) {this.dataSource = dataSource;this.columns = columns;this.displayColumns = this.columns.filter((el) => !el.hidden);provide("cdk-table", this);}
}

然后一个 provide this 反手让所有子组件都能访问,很舒服


接下来,考虑那些数据变化后,需要视图响应

你并不需要有视图再来考虑功能,上一篇文章已经讲过 mark dirty 的方式操作响应式,不再赘述

好了,接下来就是怎么使用的问题


有了数据,你只需要循环,就能得到你想要的东西

 <table><tr>{tableModel.columns.map(el=>(<th>el.header</th>))}</tr>{tableModel.dataSource.map((el,key)=><tr key={key}>{tableModel.displayColumns.map(item,index=><td key={item.dataIndex+'index'}>{item.dataIndex?item.content:item.content(el,key))}</td>}</tr>)}</table>

如果你想要的自定义头部

 <table><tr><th colSpan="10"></th></tr>{tableModel.dataSource.map((el,key)=><tr key={key}>{tableModel.displayColumns.map(item,index=><td key={item.dataIndex+'index'}>{item.dataIndex?item.content:item.content(el,key))}</td>}</tr>)}</table>

如果想要在tbody里面放th

<th>{item.dataIndex?item.content:item.content(el,key))}</th>

想要变换 order: tableModel.changeOrder('name', -1)

想要改变列显示隐藏: tableModel.toggleSomeContent(['name'],true)

如果想在这之上做类似antd table的二次封装:

<antdTable/>// 组建中
const tableModel = inejct('tableModel')
return ()=>(<table>{/* ... */}</table>
)

这种脱离组件的逻辑单元,我们叫做 kit

而为制作组件提供帮助的 kit,我们叫做 component development kit ——> cdk

对的,@angular/cdk,ahooks,都是这种东西,即 ——

针对服务编写逻辑,而不是针对组件

table列最小宽度 vue_Vue组件设计 - 先别管view相关推荐

  1. table列最小宽度 vue_vue中获取滚动table的可视页面宽度调整表头与列对齐(每列宽度不都相同)...

    mounted() { // 在mounted中监听表格scroll事件 this.$refs.scrolltable.addeventlistener( 'scroll',(event) => ...

  2. oracle adf 自定义lov,Oracle ADF table列自定义过滤组件的方法

    shortDesc="#{bindings.Pay0detailVO1.hints.Vsource.tooltip}" id="soc41" contentSt ...

  3. 饿了么ui组件中分页获取当前选中的页码值_【Web技术】314 前端组件设计原则

    点击上方"前端自习课"关注,学习起来~ 译者:@没有好名字了译文:https://github.com/lightningminers/article/issues/36,http ...

  4. vue计算多列和_解决vue 表格table列求和的问题

    最近在给朋友做一个项目,因为是B端,所以少不了表格. 本身就用了element-ui,但是订单管理有个需求使用element-ui table组件实现不了,只能退而求其之用了原生的table,功能是几 ...

  5. COM组件设计与应用(十三)(转载)

    COM组件设计与应用(十三) 事件和通知(VC6.0) 作者:杨老师 下载源代码 一.前言 我的 COM 组件运行时产生一个窗口,当用户双击该窗口的时候,我需要通知调用者: 我的 COM 组件用线程方 ...

  6. [译] 前端组件设计原则

    原文地址:Front end component design principles 原文作者:Andrew Dinihan 文中示例代码:传送门 限于个人能力,如有错漏之处,烦请不吝赐教. 前言 我 ...

  7. 面试官: 说一下前端组件设计的原则

    前言 我在最近的工作中开始使用 Vue 进行开发,但是我在上一家公司积累了三年以上 React 开发经验.虽然在两种不同的前端框架之间进行切换确实需要学习很多,但是二者之间在很多基础概念.设计思路上是 ...

  8. ant design vue table 高度自适应_Vue组件库大评测 Element, iView, HeyUI, Ant Design Vue

    今天偶然的机会想了解下其他Vue相关的组件库,网上刚好有文章,顺便自己做一下笔记,算是资源整理吧 .好了,话不多说,直接开始: 组件库的选择对于前端开发有者至关重要的影响,而组件的丰富性以及健壮性是我 ...

  9. table 列宽计算方式

    一.固定表局部算法 使用这种快速算法,表格的水平布局不依赖于单元格的内容,仅取决于表格的宽度,列的宽度以及边框或单元格间距. 每列宽度算法: 如果列元素的 "width" 属性值不 ...

  10. ueditor上传组件显示乱码_最全面的移动端 UI组件设计详解:中篇

    上一期给大家讲解了<最全面的移动端UI组件设计详解:上篇>,主要分享了:布局组件和导航组件2个部分:这次给大家带来:基础组件.表单组件和反馈组件详解,希望你在设计APP.小程序.H5页面中 ...

最新文章

  1. 6个月为50篇AI论文写摘要,网友:这有啥,我曾被要求1.5小时内复现一篇论文...
  2. R语言使用ggpubr包的ggbarplot函数可视化水平偏差条形图(计算数值的z-score、自定义填充色、自定义条形边缘色、自定义调色板、条形图全局排序从小到大、文本标签角度、添加图例标签、轴标签
  3. oracle 高水位线回收,回收高水位线
  4. 收藏!细胞增殖实验要点详解
  5. 五十四、快速上手uniapp
  6. 安卓开发环境搭建(转)
  7. 智伴机器人课文跟读哪里有_仁爱版英语九年级上册Unit4 Topic1单词课文朗读/翻译+知识汇总...
  8. 【点分治】Tree(luogu 4178/金牌导航 点分治-1)
  9. vue脚手架v-cli,第一个vue程序
  10. centos安装多个tomcat
  11. [deviceone开发]-doSpace应用源码开源
  12. 20140617 数组和链表的区别
  13. [转载] python中chr和str,以及ordint
  14. Linux之LIBRARY_PATH与LD_LIBRARY_PATH配置多个目录用法
  15. 折腾Java设计模式之访问者模式
  16. 电竞帮服务器未响应,电竞显示器ips面板1ms响应时间?被蒙骗是因为你还不了解MPRT技术!...
  17. LOJ 6437 [PKUSC 2018] PKUSC
  18. 租房经历总结-----我是如何2天找到合适租房的(房东直租)简单粗暴
  19. 大数据训练营-hadoop篇-02
  20. Linux-centos7-防火墙

热门文章

  1. [转][Lucene.Net] 基本用法
  2. [ZJOI2014]力
  3. Javascript 已被弃用的或删除的特性(V客学院知识分享)
  4. MAPZONE GIS SDK接入Openlayers3之二——空间参考扩展
  5. JQuery 表格拖动调整列宽效果
  6. 面试者应向公司问什么问题?
  7. python3.7.1安装
  8. 【ACL2021】三篇高质量方面级的情感分析方法解读
  9. 【新Attention】最强的Attention函数诞生啦,带给你意想不到的巨大提升!
  10. 推荐系统与GNN擦出的火花竟如此绚丽多彩