├── .gitignore
├── static
├── zTable.jpg
└── z-table
│ └── z-table.png
├── main.js
├── App.vue
├── pages.json
├── README.md
├── uni.scss
├── manifest.json
├── components
└── z-table
│ └── z-table.vue
└── pages
└── index
└── index.vue
/.gitignore:
--------------------------------------------------------------------------------
1 | /unpackage
2 | zTable.zip
3 | components.zip
4 |
--------------------------------------------------------------------------------
/static/zTable.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/calamus0427/z-table/master/static/zTable.jpg
--------------------------------------------------------------------------------
/static/z-table/z-table.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/calamus0427/z-table/master/static/z-table/z-table.png
--------------------------------------------------------------------------------
/main.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue'
2 | import App from './App'
3 |
4 | Vue.config.productionTip = false
5 |
6 | App.mpType = 'app'
7 |
8 | const app = new Vue({
9 | ...App
10 | })
11 | app.$mount()
12 |
--------------------------------------------------------------------------------
/App.vue:
--------------------------------------------------------------------------------
1 |
14 |
15 |
18 |
--------------------------------------------------------------------------------
/pages.json:
--------------------------------------------------------------------------------
1 | {
2 | "pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
3 | {
4 | "path": "pages/index/index",
5 | "style": {
6 | "navigationBarTitleText": "z-table使用示例"
7 | }
8 | }
9 | ],
10 | "globalStyle": {
11 | "navigationBarTextStyle": "black",
12 | "navigationBarTitleText": "uni-app",
13 | "navigationBarBackgroundColor": "#F8F8F8",
14 | "backgroundColor": "#F8F8F8"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # z-table
2 | uni-app的表格插件
3 | 目前兼容H5和微信小程序
4 |
5 | ### 表格使用
6 | #### props:
7 | ##### tableData Array | 表格数据
8 | ##### columns Array | 数据映射表 每列params => title(表头文字), width(每列宽度) [, key(对应tableData的字段名) || format(自定义内容), sort(是否要排序), isLink(是否显示为超链接Object)]
9 | ##### format格式: {template: 字符串模版用#key#表示需要被替换的数据,names: 对应template属性内要被替换的内容的key}
10 | ##### isLink格式: {url: 链接地址, params: 地址带的参数Array[key|value, key|value, ...]每一项都是key和value以'|'链接,如果不带'|'默认键值同名}
11 | ##### stickSide Boolean | 是否固定右侧首栏 默认不显示
12 | ##### showBottomSum Boolean | 是否显示底部统计 默认不显示
13 | ##### showLoading Boolean | 是否首次加载首次加载不显示暂无数据内容
14 | ##### emptyText String | 空数据显示的文字内容
15 | ##### tableHeight Number | 设置表格高度会滚动
16 | ##### sort Boolean | 开启排序
17 | ---
18 | #### event:
19 | ##### onSort | 排序事件 返回{key: 被排序列的字段名, type: 正序'asc'/倒序'desc'}
20 | ---
21 | #### function:
22 | ##### resetSort | 调用后重置排序 *注意:不会触发sort事件
23 |
24 | ### 效果预览
25 | 
26 |
--------------------------------------------------------------------------------
/uni.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * 这里是uni-app内置的常用样式变量
3 | *
4 | * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
5 | * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
6 | *
7 | */
8 |
9 | /**
10 | * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
11 | *
12 | * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
13 | */
14 |
15 | /* 颜色变量 */
16 |
17 | /* 行为相关颜色 */
18 | $uni-color-primary: #007aff;
19 | $uni-color-success: #4cd964;
20 | $uni-color-warning: #f0ad4e;
21 | $uni-color-error: #dd524d;
22 |
23 | /* 文字基本颜色 */
24 | $uni-text-color:#333;//基本色
25 | $uni-text-color-inverse:#fff;//反色
26 | $uni-text-color-grey:#999;//辅助灰色,如加载更多的提示信息
27 | $uni-text-color-placeholder: #808080;
28 | $uni-text-color-disable:#c0c0c0;
29 |
30 | /* 背景颜色 */
31 | $uni-bg-color:#ffffff;
32 | $uni-bg-color-grey:#f8f8f8;
33 | $uni-bg-color-hover:#f1f1f1;//点击状态颜色
34 | $uni-bg-color-mask:rgba(0, 0, 0, 0.4);//遮罩颜色
35 |
36 | /* 边框颜色 */
37 | $uni-border-color:#c8c7cc;
38 |
39 | /* 尺寸变量 */
40 |
41 | /* 文字尺寸 */
42 | $uni-font-size-sm:24upx;
43 | $uni-font-size-base:28upx;
44 | $uni-font-size-lg:32upx;
45 |
46 | /* 图片尺寸 */
47 | $uni-img-size-sm:40upx;
48 | $uni-img-size-base:52upx;
49 | $uni-img-size-lg:80upx;
50 |
51 | /* Border Radius */
52 | $uni-border-radius-sm: 4upx;
53 | $uni-border-radius-base: 6upx;
54 | $uni-border-radius-lg: 12upx;
55 | $uni-border-radius-circle: 50%;
56 |
57 | /* 水平间距 */
58 | $uni-spacing-row-sm: 10px;
59 | $uni-spacing-row-base: 20upx;
60 | $uni-spacing-row-lg: 30upx;
61 |
62 | /* 垂直间距 */
63 | $uni-spacing-col-sm: 8upx;
64 | $uni-spacing-col-base: 16upx;
65 | $uni-spacing-col-lg: 24upx;
66 |
67 | /* 透明度 */
68 | $uni-opacity-disabled: 0.3; // 组件禁用态的透明度
69 |
70 | /* 文章场景相关 */
71 | $uni-color-title: #2C405A; // 文章标题颜色
72 | $uni-font-size-title:40upx;
73 | $uni-color-subtitle: #555555; // 二级标题颜色
74 | $uni-font-size-subtitle:36upx;
75 | $uni-color-paragraph: #3F536E; // 文章段落颜色
76 | $uni-font-size-paragraph:30upx;
--------------------------------------------------------------------------------
/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "name" : "zTable",
3 | "appid" : "__UNI__DA6EA08",
4 | "description" : "",
5 | "versionName" : "1.0.0",
6 | "versionCode" : "100",
7 | "transformPx" : false,
8 | "app-plus" : {
9 | /* 5+App特有相关 */
10 | "usingComponents" : true,
11 | "splashscreen" : {
12 | "alwaysShowBeforeRender" : true,
13 | "waiting" : true,
14 | "autoclose" : true,
15 | "delay" : 0
16 | },
17 | "modules" : {},
18 | /* 模块配置 */
19 | "distribute" : {
20 | /* 应用发布信息 */
21 | "android" : {
22 | /* android打包配置 */
23 | "permissions" : [
24 | "",
25 | "",
26 | "",
27 | "",
28 | "",
29 | "",
30 | "",
31 | "",
32 | "",
33 | "",
34 | "",
35 | "",
36 | "",
37 | "",
38 | "",
39 | "",
40 | "",
41 | "",
42 | "",
43 | "",
44 | "",
45 | ""
46 | ]
47 | },
48 | "ios" : {},
49 | /* ios打包配置 */
50 | "sdkConfigs" : {}
51 | }
52 | },
53 | /* SDK配置 */
54 | "quickapp" : {},
55 | /* 快应用特有相关 */
56 | "mp-weixin" : {
57 | /* 小程序特有相关 */
58 | "appid" : "wx2601089995dbaa81",
59 | "setting" : {
60 | "urlCheck" : false,
61 | "minified" : true,
62 | "postcss" : false
63 | },
64 | "usingComponents" : true
65 | }
66 | }
67 |
--------------------------------------------------------------------------------
/components/z-table/z-table.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 |
11 |
12 |
13 |
14 |
15 |
16 |
24 | {{ item.title }}
25 |
29 |
33 |
37 |
38 |
39 |
40 |
44 |
50 |
57 |
61 |
62 |
67 |
72 |
73 |
74 |
79 |
80 |
81 |
82 |
83 |
87 |
94 |
95 |
96 | {{ sumIndex == 0 ? '总计' : dosum(sumCol.key) }}
97 |
98 |
99 |
100 |
101 |
102 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
362 |
363 |
639 |
--------------------------------------------------------------------------------
/pages/index/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | v 1.0.7
5 |
6 | 注意:
7 | 本示例必须使用sass插件,请在HbuildX的工具-插件安装中安装scss/sass编译插件
8 | {{ showUpData ? '隐藏' : '显示' }}更新内容
9 |
10 |
11 | 1.0.7更新内容:
12 | 优化dosum事件,如果当前列中有个字段为非数字则计算出来的总和为'-'
13 | 1.0.6更新内容:
14 | 添加title或者表格内容异步获取时的loading,注意如果需要异步加载,需要把tableData初始值设为false,当没有数据的时候值为空数组
15 | 1.0.4更新内容:
16 | 数据高度小于视窗高度的时候,底部统计不再显示跟随最后一条数据显示,而是沉在视窗底部
17 |
18 |
19 |
20 |
21 | 基础使用示例
22 |
23 |
24 |
25 | code:
26 |
27 |
28 | html代码:
29 | {{baseHtml}}
30 |
31 | js代码:
32 | baseTableData: [{
33 | name: "张三",
34 | age: 18,
35 | gender: "男"
36 | },{
37 | name: "赵四",
38 | age: 16,
39 | gender: "女"
40 | },{
41 | name: "王五",
42 | age: 20,
43 | gender: "男"
44 | },{
45 | name: "李六",
46 | age: 18,
47 | gender: "女"
48 | }],
49 |
50 | baseColumns: [{
51 | title: "姓名",
52 | key: "name",
53 | width: 100
54 | },{
55 | title: "性别",
56 | key: "gender",
57 | width: 100
58 | },{
59 | title: "年龄",
60 | key: "age",
61 | width: 100
62 | }]
63 |
64 |
65 |
66 | 参数
67 |
68 | tableData [Array] 需要展示的数据
69 | columns [Array] 表格列的配置描述
70 |
71 | columns具体参数
72 |
73 | title [String] 列名
74 | key [String] 对应tableData中的字段名
75 | width [Number] 列宽(如果不给列宽会出现列宽不一致的问题)
76 |
77 |
78 |
79 |
80 | 左侧固定的表格示例
81 |
82 |
83 |
84 | code:
85 |
86 |
87 | html代码:
88 | {{stickSideHtml}}
89 |
90 | js代码:
91 | stickSideTableData: [{
92 | name: "张三",
93 | age: 18,
94 | gender: "男"
95 | },{
96 | name: "赵四",
97 | age: 16,
98 | gender: "女"
99 | },{
100 | name: "王五",
101 | age: 20,
102 | gender: "男"
103 | },{
104 | name: "李六",
105 | age: 18,
106 | gender: "女"
107 | }],
108 |
109 | stickSideColumns: [{
110 | title: "姓名",
111 | key: "name",
112 | width: 100
113 | },{
114 | title: "性别",
115 | key: "gender",
116 | width: 400
117 | },{
118 | title: "年龄",
119 | key: "age",
120 | width: 400
121 | }]
122 |
123 |
124 |
125 | 参数
126 |
127 | 其他参数一样
128 | stickSide [Boolean] 是否固定左侧第一列
129 |
130 |
131 |
132 |
133 | 显示底部统计的表格示例
134 |
135 |
136 |
137 | code:
138 |
139 |
140 | html代码:
141 | {{showBottomSumHtml}}
142 |
143 | js代码:
144 | showBottomSumTableData: [{
145 | name: "张三",
146 | age: 18,
147 | gender: "男"
148 | },{
149 | name: "赵四",
150 | age: 16,
151 | gender: "女"
152 | },{
153 | name: "王五",
154 | age: 20,
155 | gender: "男"
156 | },{
157 | name: "李六",
158 | age: 18,
159 | gender: "女"
160 | }],
161 |
162 | showBottomSumColumns: [{
163 | title: "姓名",
164 | key: "name",
165 | width: 100
166 | },{
167 | title: "性别",
168 | key: "gender",
169 | width: 400
170 | },{
171 | title: "年龄",
172 | key: "age",
173 | width: 400
174 | }]
175 |
176 |
177 |
178 | 参数
179 |
180 | 其他参数一样
181 | showBottomSum [Boolean] 是否显示底部统计行
182 |
183 |
184 |
185 |
186 | 自定义内容的表格示例
187 |
188 |
189 |
190 | code:
191 |
192 |
193 | html代码:
194 | {{customHtml}}
195 |
196 | js代码:
197 | customTableData: [{
198 | name: "张三",
199 | age: 18,
200 | gender: "男"
201 | },{
202 | name: "赵四",
203 | age: 16,
204 | gender: "女"
205 | },{
206 | name: "王五",
207 | age: 20,
208 | gender: "男"
209 | },{
210 | name: "李六",
211 | age: 18,
212 | gender: "女"
213 | }],
214 |
215 | customColumns: [{
216 | title: "姓名",
217 | format: {
218 | template: "我叫 #name#",
219 | names: ["name"]
220 | },
221 | width: 200
222 | },{
223 | title: "性别",
224 | key: "gender",
225 | width: 400
226 | },{
227 | title: "年龄",
228 | key: "age",
229 | width: 400
230 | }]
231 |
232 |
233 |
234 | 参数
235 |
236 | 其他参数一样
237 |
238 | columns中的key替换为format
239 |
240 | format [Object] 自定义内容
241 |
242 | format具体参数
243 |
244 | template [String] 自定义内容模版需要用到tableData中的字段时用#key#(key是字段名)来替换
245 | name [Array] 对应tableData中的字段名数组
246 |
247 |
248 |
249 |
250 | 单元格内容为链接的示例
251 |
252 |
253 |
254 | code:
255 |
256 |
257 | html代码:
258 | {{isLinkHtml}}
259 |
260 | js代码:
261 | isLinkTableData: [{
262 | name: "张三",
263 | age: 18,
264 | gender: "男"
265 | },{
266 | name: "赵四",
267 | age: 16,
268 | gender: "女"
269 | },{
270 | name: "王五",
271 | age: 20,
272 | gender: "男"
273 | },{
274 | name: "李六",
275 | age: 18,
276 | gender: "女"
277 | }],
278 |
279 | isLinkColumns: [{
280 | title: "姓名",
281 | key: "name",
282 | isLink: {
283 | url: "https://www.baidu.com",
284 | params: ["from|name"]
285 | },
286 | width: 100
287 | },{
288 | title: "性别",
289 | key: "gender",
290 | width: 100
291 | },{
292 | title: "年龄",
293 | key: "age",
294 | width: 100
295 | }]
296 |
297 |
298 |
299 | 参数
300 |
301 | 其他参数一样
302 |
303 | columns中的添加参数isLink
304 |
305 | isLink [Object] 单元格为链接的数据
306 |
307 | isLink具体参数
308 |
309 | url [String] 链接地址, 在H5上地址带http被认为是外部链接
310 | params [Array] 地址带的参数[key|value, key|value, ...]每一项都是key和value以"|"链接,如果不带"|"默认键值同名 value就是tableData中的字段名
311 |
312 |
313 |
314 |
315 | 自定义判空显示的示例
316 |
317 |
318 |
319 | code:
320 |
321 |
322 | html代码:
323 | {{emptyHtml}}
324 |
325 | js代码:
326 | emptyTableData: [],
327 | emptyColumns: [{
328 | title: "姓名",
329 | key: "name",
330 | width: 100
331 | },{
332 | title: "性别",
333 | key: "gender",
334 | width: 100
335 | },{
336 | title: "年龄",
337 | key: "age",
338 | width: 100
339 | }]
340 |
341 |
342 |
343 | 参数
344 |
345 | 其他参数一样
346 | showLoading [Boolean] 对于第一次渲染表格时显示正在加载
347 | emptyText [String] 空数据显示的文字内容, 默认:暂无数据
348 |
349 |
350 |
351 |
352 | 自定义高度示例
353 |
354 |
355 |
356 | code:
357 |
358 |
359 | html代码:
360 | {{heightHtml}}
361 |
362 | js代码:
363 | heightTableData: [{
364 | name: "张三",
365 | age: 18,
366 | gender: "男"
367 | },{
368 | name: "赵四",
369 | age: 16,
370 | gender: "女"
371 | },{
372 | name: "王五",
373 | age: 20,
374 | gender: "男"
375 | },{
376 | name: "李六",
377 | age: 18,
378 | gender: "女"
379 | }],
380 | heightColumns: [{
381 | title: "姓名",
382 | key: "name",
383 | width: 100
384 | },{
385 | title: "性别",
386 | key: "gender",
387 | width: 100
388 | },{
389 | title: "年龄",
390 | key: "age",
391 | width: 100
392 | }]
393 |
394 |
395 |
396 | 参数
397 |
398 | 其他参数一样
399 | tableHeight [Number] 表格的高度超出会开启滚动,(实测谷歌亲儿子机型可能会出现下拉触发整个页面下拉刷新的问题)
400 |
401 |
402 |
403 |
404 | 开启排序示例
405 |
406 |
407 |
408 | code:
409 |
410 |
411 | html代码:
412 | {{sortHtml}}
413 |
414 | js代码:
415 | sortTableData: [{
416 | name: "张三",
417 | age: 18,
418 | gender: "男"
419 | },{
420 | name: "赵四",
421 | age: 16,
422 | gender: "女"
423 | },{
424 | name: "王五",
425 | age: 20,
426 | gender: "男"
427 | },{
428 | name: "李六",
429 | age: 18,
430 | gender: "女"
431 | }],
432 |
433 | sortColumns: [{
434 | title: "姓名",
435 | key: "name",
436 | width: 100
437 | },{
438 | title: "性别",
439 | key: "gender",
440 | sort: true,
441 | width: 100
442 | },{
443 | title: "年龄",
444 | key: "age",
445 | sort: true,
446 | width: 100
447 | }]
448 |
449 |
450 |
451 | 参数
452 |
453 | sort [Boolean] 开启排序
454 |
455 | 回调事件
456 |
457 | onSort [Function] 向上触发sort事件传递参数 [Object]:
458 | {
459 | key: 列的字段名,
460 | type: 正序"asc"/倒序"desc"
461 | }
462 | 最终排序需要到外部自行实现
463 |
464 |
465 | 事件
466 |
467 | resetSort [Function] 父级可以调用这个方法来重置排序
468 |
469 |
470 |
471 |
472 | 开启所有功能
473 |
474 |
475 |
476 | code:
477 |
478 |
479 | html代码:
480 | {{finaleHtml}}
481 |
482 | js代码:
483 | sortTableData: [{
484 | name: "张三",
485 | age: 18,
486 | gender: "男"
487 | },{
488 | name: "赵四",
489 | age: 16,
490 | gender: "女"
491 | },{
492 | name: "王五",
493 | age: 20,
494 | gender: "男"
495 | },{
496 | name: "李六",
497 | age: 18,
498 | gender: "女"
499 | },
500 | ...
501 | ],
502 |
503 | sortColumns: [{
504 | title: "姓名",
505 | key: "name",
506 | format: {
507 | template: "我叫 #name#",
508 | names: ["name"]
509 | },
510 | isLink: {
511 | url: "https://www.baidu.com",
512 | params: ["from|name"]
513 | },
514 | width: 200
515 | },{
516 | title: "性别",
517 | key: "gender",
518 | sort: true,
519 | width: 100
520 | },{
521 | title: "年龄",
522 | key: "age",
523 | sort: true,
524 | width: 100
525 | }]
526 |
527 |
528 |
529 |
530 |
531 |
532 |
940 |
941 |
1033 |
--------------------------------------------------------------------------------