<script> import vueContextMenu from "@main/components/contextMenu"; function noop() {} export default { props:{ panels:Array, onTabClick: { type: Function, default: noop }, onTabRemove: { type: Function, default: noop }, onTabCloseAll: { type: Function, default: noop } }, data(){ return { curContextMenuName:'',//右击tab curContextMenuIndex:null } }, methods:{ resize(){ let tabWidth=0; let children = this.$el.querySelectorAll('li'); Array.prototype.map.call(children, function (el, index, list) { let rct = el.getBoundingClientRect(); tabWidth += rct.width; }); this.$el.style.width = (tabWidth+2)+'px'; let id = this.$parent.currentName; if (this.$refs[id] == null) return; let scrollLeft = this.$refs[id].offsetLeft, scrollArea = this.$refs[id].parentNode.parentNode.parentNode; if (scrollArea.offsetWidth < scrollLeft) { scrollArea.scrollLeft = scrollLeft; } else if (scrollArea.scrollLeft > scrollLeft) { scrollArea.scrollLeft = scrollLeft; } }, onClose(panel,e){ e.stopPropagation(); if(panel.$listeners&&panel.$listeners.onBeforeClose(panel,e)===false){ return; } this.$emit('onTabClose',panel.name); }, onActive(panel,evt){ panel.$listeners&&panel.$listeners.onSelected(panel,evt) this.$emit('onTabChange',panel.name); }, onContextMenu(panel,index,e) { e.preventDefault() this.curContextMenuName = panel.name; this.curContextMenuIndex = index, this.$refs['cmp-tabContextMenu'].open(e); }, handleContextMenuRefresh() { let panel = this.panels[this.curContextMenuIndex]; if(panel){ let ifm = panel.$el.querySelector('iframe'); if (ifm&&ifm.src&&ifm.src.indexOf('about:blank')==-1) { ifm.contentWindow.window.location.reload(); } } }, handleContextMenuClose(e) { // e.stopPropagation(); let panel = this.panels[this.curContextMenuIndex]; if(panel.$listeners&&panel.$listeners.onBeforeClose(panel,e)===false){ return; } this.$emit('onTabClose',panel.name); }, handleContextMenuCloseAll(e) { this.$emit('onTabCloseAll'); }, handleContextMenuCloseRt() { this.$emit('onTabCloseRt',this.curContextMenuName,this.curContextMenuIndex); }, handleContextMenuCloseLt() { this.$emit('onTabCloseLt',this.curContextMenuName,this.curContextMenuIndex); }, handleContextMenuCloseOt() { this.$emit('onTabCloseOt',this.curContextMenuName,this.curContextMenuIndex); } }, render(h){ let { $lang, onClose, onActive, onContextMenu }=this; let tabs = this._l(this.panels,(panel,index)=>{ const nodeProps = { class:{ ['pl-tabs-item']:1, ['pl-tabs-itemSeld']:panel.name == this.$parent.currentName }, attrs:{ id:'tab_'+panel.name } }; const closeTpl = ( <i class="pl-tabs-itemClose iconfont icon-close" on-click={(ev) => { onClose(panel, ev); }}></i> ) return ( <li ref={panel.name} on-contextmenu={(ev) => { onContextMenu(panel,index, ev); }}> <div {...nodeProps} on-click={(ev) => {onActive(panel, ev); }}> <span class="pl-tabs-itemTxt sys-tab-item-text">{panel.title}</span> {(panel.close===""||panel.close===true)&&closeTpl} </div> </li> ) }); const ctxMenuProp = { props: { ['menu-items']: [ { title: $lang('refresh')||'刷新', iconClass: 'icon-refresh', handler: this.handleContextMenuRefresh, }, { title: $lang('close')||'关闭', iconClass: 'icon-close-circle', handler: this.handleContextMenuClose, }, { title: $lang('closeLeft')||'关闭左侧', iconClass: 'icon-arrow-leftMore-circle', handler: this.handleContextMenuCloseLt, }, { title: $lang('closeRight')||'关闭右侧', iconClass: 'icon-arrow-rightMore-circle', handler: this.handleContextMenuCloseRt, }, { title: $lang('closeOther')||'关闭其它', iconClass: 'icon-closeOther', handler: this.handleContextMenuCloseOt, }, { title: $lang('closeAll')||'关闭所有', iconClass: 'icon-closeAll', handler: this.handleContextMenuCloseAll, }, ] } }; return ( <div> <ul>{tabs}</ul> <vueContextMenu ref="cmp-tabContextMenu" {...ctxMenuProp}></vueContextMenu> </div> ) }, updated(){ this.$parent.resize(); } } </script>