Element分析(组件篇)——Table

姓名:岳沁  学号:17101223458

转载自:http://www.jianshu.com/p/91ae0724f5f3

【嵌牛导读】:Element分析(组件篇)——Table

【嵌牛鼻子】:Table

【嵌牛提问】:Table如何实现将表头放在左侧?

【嵌牛正文】:

源码解读

首先是template部分。

:class="{

'el-table--fit': fit,

'el-table--striped': stripe,

'el-table--border': border,

'el-table--fluid-height': maxHeight,

'el-table--enable-row-hover': !store.states.isComplex,

'el-table--enable-row-transition': true || (store.states.data || []).length !== 0 && (store.states.data || []).length < 100

}"

@mouseleave="handleMouseLeave($event)">



:store="store"

:layout="layout"

:border="border"

:default-sort="defaultSort"

:style="{ width: layout.bodyWidth ? layout.bodyWidth + 'px' : '' }">


class="el-table__body-wrapper"

ref="bodyWrapper"

:style="[bodyHeight]">

:context="context"

:store="store"

:layout="layout"

:row-class-name="rowClassName"

:row-style="rowStyle"

:highlight="highlightCurrentRow"

:style="{ width: bodyWidth }">

:style="{ width: bodyWidth }"

class="el-table__empty-block"

v-if="!data || data.length === 0">

{{ emptyText || t('el.table.emptyText') }}


v-if="fixedColumns.length > 0"

:style="[

{ width: layout.fixedWidth ? layout.fixedWidth + 'px' : '' },

fixedHeight

]">

fixed="left"

:border="border"

:store="store"

:layout="layout"

:style="{ width: layout.fixedWidth ? layout.fixedWidth + 'px' : '' }">

:style="[

{ top: layout.headerHeight + 'px' },

fixedBodyHeight

]">

fixed="left"

:store="store"

:layout="layout"

:highlight="highlightCurrentRow"

:row-class-name="rowClassName"

:row-style="rowStyle"

:style="{ width: layout.fixedWidth ? layout.fixedWidth + 'px' : '' }">


v-if="rightFixedColumns.length > 0"

:style="[

{ width: layout.rightFixedWidth ? layout.rightFixedWidth + 'px' : '' },

{ right: layout.scrollY ? (border ? layout.gutterWidth : (layout.gutterWidth || 1)) + 'px' : '' },

fixedHeight

]">

fixed="right"

:border="border"

:store="store"

:layout="layout"

:style="{ width: layout.rightFixedWidth ? layout.rightFixedWidth + 'px' : '' }">

:style="[

{ top: layout.headerHeight + 'px' },

fixedBodyHeight

]">

fixed="right"

:store="store"

:layout="layout"

:row-class-name="rowClassName"

:row-style="rowStyle"

:highlight="highlightCurrentRow"

:style="{ width: layout.rightFixedWidth ? layout.rightFixedWidth + 'px' : '' }">


class="el-table__fixed-right-patch"

v-if="rightFixedColumns.length > 0"

:style="{

width: layout.scrollY ? layout.gutterWidth + 'px' : '0',

height: layout.headerHeight + 'px'

}">


class="el-table__column-resize-proxy"

ref="resizeProxy"

v-show="resizeProxyVisible">

其次是script的部分:

importElCheckboxfrom'element-ui/packages/checkbox';importthrottlefrom'throttle-debounce/throttle';importdebouncefrom'throttle-debounce/debounce';import{ addResizeListener, removeResizeListener }from'element-ui/src/utils/resize-event';importLocalefrom'element-ui/src/mixins/locale';importTableStorefrom'./table-store';importTableLayoutfrom'./table-layout';importTableBodyfrom'./table-body';importTableHeaderfrom'./table-header';import{ mousewheel }from'./util';lettableIdSeed =1;exportdefault{name:'ElTable',mixins: [Locale],props: {data: {type:Array,default:function(){return[];      }    },width: [String,Number],height: [String,Number],maxHeight: [String,Number],fit: {type:Boolean,default:true},stripe:Boolean,border:Boolean,rowKey: [String,Function],context: {},showHeader: {type:Boolean,default:true},rowClassName: [String,Function],rowStyle: [Object,Function],highlightCurrentRow:Boolean,currentRowKey: [String,Number],emptyText:String,expandRowKeys:Array,defaultExpandAll:Boolean,defaultSort:Object},components: {    TableHeader,    TableBody,    ElCheckbox  },methods: {// 切换选中的行toggleRowSelection(row, selected) {this.store.toggleRowSelection(row, selected);this.store.updateAllSelected();    },// 清空选中行clearSelection() {this.store.clearSelection();    },// 处理鼠标离开handleMouseLeave() {this.store.commit('setHoverRow',null);if(this.hoverState)this.hoverState =null;    },// 更新是否有纵向滚动updateScrollY() {this.layout.updateScrollY();    },// 绑定相关的时间监听bindEvents() {const{ headerWrapper } =this.$refs;constrefs =this.$refs;// 同步三个 body 的滚动this.bodyWrapper.addEventListener('scroll',function(){if(headerWrapper) headerWrapper.scrollLeft =this.scrollLeft;if(refs.fixedBodyWrapper) refs.fixedBodyWrapper.scrollTop =this.scrollTop;if(refs.rightFixedBodyWrapper) refs.rightFixedBodyWrapper.scrollTop =this.scrollTop;      });// 表头的鼠标滚动变成横向滚动if(headerWrapper) {        mousewheel(headerWrapper, throttle(16, event => {constdeltaX = event.deltaX;if(deltaX >0) {this.bodyWrapper.scrollLeft +=10;          }else{this.bodyWrapper.scrollLeft -=10;          }        }));      }// 如果自适应的话,resize 的时候重新布局if(this.fit) {this.windowResizeListener = throttle(50, () => {if(this.$ready)this.doLayout();        });        addResizeListener(this.$el,this.windowResizeListener);      }    },// 布局doLayout() {this.store.updateColumns();this.layout.update();this.updateScrollY();this.$nextTick(()=>{if(this.height) {this.layout.setHeight(this.height);        }elseif(this.maxHeight) {this.layout.setMaxHeight(this.maxHeight);        }elseif(this.shouldUpdateHeight) {this.layout.updateHeight();        }      });    }  },  created() {this.tableId ='el-table_'+ tableIdSeed +'_';this.debouncedLayout = debounce(50, () =>this.doLayout());  },computed: {    bodyWrapper() {returnthis.$refs.bodyWrapper;    },    shouldUpdateHeight() {returntypeofthis.height ==='number'||this.fixedColumns.length >0||this.rightFixedColumns.length >0;    },    selection() {returnthis.store.selection;    },    columns() {returnthis.store.states.columns;    },    tableData() {returnthis.store.states.data;    },    fixedColumns() {returnthis.store.states.fixedColumns;    },    rightFixedColumns() {returnthis.store.states.rightFixedColumns;    },    bodyHeight() {letstyle = {};if(this.height) {        style = {height:this.layout.bodyHeight ?this.layout.bodyHeight +'px':''};      }elseif(this.maxHeight) {        style = {'max-height': (this.showHeader ?this.maxHeight -this.layout.headerHeight :this.maxHeight) +'px'};      }returnstyle;    },    bodyWidth() {const{ bodyWidth, scrollY, gutterWidth } =this.layout;returnbodyWidth ? bodyWidth - (scrollY ? gutterWidth :0) +'px':'';    },    fixedBodyHeight() {letstyle = {};if(this.height) {        style = {height:this.layout.fixedBodyHeight ?this.layout.fixedBodyHeight +'px':''};      }elseif(this.maxHeight) {letmaxHeight =this.layout.scrollX ?this.maxHeight -this.layout.gutterWidth :this.maxHeight;if(this.showHeader) {          maxHeight -=this.layout.headerHeight;        }        style = {'max-height': maxHeight +'px'};      }returnstyle;    },    fixedHeight() {letstyle = {};if(this.maxHeight) {        style = {bottom: (this.layout.scrollX &&this.data.length) ?this.layout.gutterWidth +'px':''};      }else{        style = {height:this.layout.viewportHeight ?this.layout.viewportHeight +'px':''};      }returnstyle;    }  },watch: {// 高度改变时,重新设定高度height(value) {this.layout.setHeight(value);    },// 当前行的 key 改变时,重新设置currentRowKey(newVal) {this.store.setCurrentRowKey(newVal);    },// 更新数据data: {immediate:true,      handler(val) {this.store.commit('setData', val);      }    },// 更改打开的行的 keyexpandRowKeys(newVal) {this.store.setExpandRowKeys(newVal);    }  },  destroyed() {// 移除 resize 监听if(this.windowResizeListener) removeResizeListener(this.$el,this.windowResizeListener);  },  mounted() {this.bindEvents();this.doLayout();this.$ready =true;  },  data() {// 状态管理conststore =newTableStore(this, {rowKey:this.rowKey,defaultExpandAll:this.defaultExpandAll    });// 布局管理constlayout =newTableLayout({      store,table:this,fit:this.fit,showHeader:this.showHeader    });return{      store,      layout,renderExpanded:null,resizeProxyVisible:false};  }};

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容

  • 说明 table.vue 是最终将各个组件拼接起来的地方,较为简单,因此不进行赘述,请确保看过一下几个分解的部分:...
    liril阅读 38,480评论 12 20
  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,737评论 1 92
  • 美国杜克大学提出后现代主义的大学者詹姆逊,当年曾写文章评论Terminator 2(终结者2),阿诺施瓦辛格主演,...
    落亦无悔阅读 692评论 0 0
  • 从九月一日开始打卡写作以来,写得最常见的便是小女子热气腾腾的红尘生活。有时候觉得,清晨坐电脑前还真不知从何处开始动...
    孙润阅读 404评论 0 0