fix
							parent
							
								
									eb021ff40c
								
							
						
					
					
						commit
						b1f8fd739f
					
				|  | @ -0,0 +1,14 @@ | |||
| <script> | ||||
| import InkTabBarMixin from './InkTabBarMixin' | ||||
| import TabBarMixin from './TabBarMixin' | ||||
| 
 | ||||
| export default { | ||||
|   name: 'InkTabBar', | ||||
|   mixins: [TabBarMixin, InkTabBarMixin], | ||||
|   render () { | ||||
|     const inkBarNode = this.getInkBarNode() | ||||
|     const tabs = this.getTabs() | ||||
|     return this.getRootNode([inkBarNode, tabs]) | ||||
|   }, | ||||
| } | ||||
| </script> | ||||
|  | @ -0,0 +1,146 @@ | |||
| import { setTransform, isTransformSupported } from './utils' | ||||
| 
 | ||||
| export function getScroll (w, top) { | ||||
|   let ret = w[`page${top ? 'Y' : 'X'}Offset`] | ||||
|   const method = `scroll${top ? 'Top' : 'Left'}` | ||||
|   if (typeof ret !== 'number') { | ||||
|     const d = w.document | ||||
|     // ie6,7,8 standard mode
 | ||||
|     ret = d.documentElement[method] | ||||
|     if (typeof ret !== 'number') { | ||||
|       // quirks mode
 | ||||
|       ret = d.body[method] | ||||
|     } | ||||
|   } | ||||
|   return ret | ||||
| } | ||||
| 
 | ||||
| function offset (elem) { | ||||
|   let x | ||||
|   let y | ||||
|   const doc = elem.ownerDocument | ||||
|   const body = doc.body | ||||
|   const docElem = doc && doc.documentElement | ||||
|   const box = elem.getBoundingClientRect() | ||||
|   x = box.left | ||||
|   y = box.top | ||||
|   x -= docElem.clientLeft || body.clientLeft || 0 | ||||
|   y -= docElem.clientTop || body.clientTop || 0 | ||||
|   const w = doc.defaultView || doc.parentWindow | ||||
|   x += getScroll(w) | ||||
|   y += getScroll(w, true) | ||||
|   return { | ||||
|     left: x, top: y, | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| function componentDidUpdate (component, init) { | ||||
|   const { styles } = component.$props | ||||
|   const wrapNode = component.$refs.nav || component.$refs.root | ||||
|   const containerOffset = offset(wrapNode) | ||||
|   const inkBarNode = component.$refs.inkBar | ||||
|   const activeTab = component.$refs.activeTab | ||||
|   const inkBarNodeStyle = inkBarNode.style | ||||
|   const tabBarPosition = component.$props.tabBarPosition | ||||
|   if (init) { | ||||
|     // prevent mount animation
 | ||||
|     inkBarNodeStyle.display = 'none' | ||||
|   } | ||||
|   if (activeTab) { | ||||
|     const tabNode = activeTab | ||||
|     const tabOffset = offset(tabNode) | ||||
|     const transformSupported = isTransformSupported(inkBarNodeStyle) | ||||
|     if (tabBarPosition === 'top' || tabBarPosition === 'bottom') { | ||||
|       let left = tabOffset.left - containerOffset.left | ||||
|       let width = tabNode.offsetWidth | ||||
| 
 | ||||
|       // If tabNode'width width equal to wrapNode'width when tabBarPosition is top or bottom
 | ||||
|       // It means no css working, then ink bar should not have width until css is loaded
 | ||||
|       // Fix https://github.com/ant-design/ant-design/issues/7564
 | ||||
|       if (width === wrapNode.offsetWidth) { | ||||
|         width = 0 | ||||
|       } else if (styles.inkBar && styles.inkBar.width !== undefined) { | ||||
|         width = parseFloat(styles.inkBar.width, 10) | ||||
|         if (width) { | ||||
|           left = left + (tabNode.offsetWidth - width) / 2 | ||||
|         } | ||||
|       } | ||||
|       // use 3d gpu to optimize render
 | ||||
|       if (transformSupported) { | ||||
|         setTransform(inkBarNodeStyle, `translate3d(${left}px,0,0)`) | ||||
|         inkBarNodeStyle.width = `${width}px` | ||||
|         inkBarNodeStyle.height = '' | ||||
|       } else { | ||||
|         inkBarNodeStyle.left = `${left}px` | ||||
|         inkBarNodeStyle.top = '' | ||||
|         inkBarNodeStyle.bottom = '' | ||||
|         inkBarNodeStyle.right = `${wrapNode.offsetWidth - left - width}px` | ||||
|       } | ||||
|     } else { | ||||
|       let top = tabOffset.top - containerOffset.top | ||||
|       let height = tabNode.offsetHeight | ||||
|       if (styles.inkBar && styles.inkBar.height !== undefined) { | ||||
|         height = parseFloat(styles.inkBar.height, 10) | ||||
|         if (height) { | ||||
|           top = top + (tabNode.offsetHeight - height) / 2 | ||||
|         } | ||||
|       } | ||||
|       if (transformSupported) { | ||||
|         setTransform(inkBarNodeStyle, `translate3d(0,${top}px,0)`) | ||||
|         inkBarNodeStyle.height = `${height}px` | ||||
|         inkBarNodeStyle.width = '' | ||||
|       } else { | ||||
|         inkBarNodeStyle.left = '' | ||||
|         inkBarNodeStyle.right = '' | ||||
|         inkBarNodeStyle.top = `${top}px` | ||||
|         inkBarNodeStyle.bottom = `${wrapNode.offsetHeight - top - height}px` | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   inkBarNodeStyle.display = activeTab ? 'block' : 'none' | ||||
| } | ||||
| 
 | ||||
| export default { | ||||
|   props: { | ||||
|     inkBarAnimated: { | ||||
|       type: Boolean, | ||||
|       default: true, | ||||
|     }, | ||||
|     prefixCls: String, | ||||
|     styles: Object, | ||||
|   }, | ||||
|   updated () { | ||||
|     this.$nextTick(function () { | ||||
|       componentDidUpdate(this, true) | ||||
|     }) | ||||
|     componentDidUpdate(this) | ||||
|   }, | ||||
| 
 | ||||
|   mounted () { | ||||
|     this.$nextTick(function () { | ||||
|       componentDidUpdate(this, true) | ||||
|     }) | ||||
|   }, | ||||
|   methods: { | ||||
|     getInkBarNode () { | ||||
|       const { prefixCls, styles = {}, inkBarAnimated } = this | ||||
|       const className = `${prefixCls}-ink-bar` | ||||
|       const classes = { | ||||
|         [className]: true, | ||||
|         [ | ||||
|         inkBarAnimated | ||||
|           ? `${className}-animated` | ||||
|           : `${className}-no-animated` | ||||
|         ]: true, | ||||
|       } | ||||
|       return ( | ||||
|         <div | ||||
|           style={styles.inkBar} | ||||
|           class={classes} | ||||
|           key='inkBar' | ||||
|           ref='inkBar' | ||||
|         /> | ||||
|       ) | ||||
|     }, | ||||
|   }, | ||||
| } | ||||
|  | @ -0,0 +1,17 @@ | |||
| <script> | ||||
| import InkTabBarMixin from './InkTabBarMixin' | ||||
| import ScrollableTabBarMixin from './ScrollableTabBarMixin' | ||||
| import TabBarMixin from './TabBarMixin' | ||||
| 
 | ||||
| export default { | ||||
|   name: 'ScrollableInkTabBar', | ||||
|   mixins: [TabBarMixin, InkTabBarMixin, ScrollableTabBarMixin], | ||||
|   render () { | ||||
|     const inkBarNode = this.getInkBarNode() | ||||
|     const tabs = this.getTabs() | ||||
|     const scrollbarNode = this.getScrollBarNode([inkBarNode, tabs]) | ||||
|     return this.getRootNode(scrollbarNode) | ||||
|   }, | ||||
| } | ||||
| </script> | ||||
| 
 | ||||
|  | @ -0,0 +1,16 @@ | |||
| <script> | ||||
| import ScrollableTabBarMixin from './ScrollableTabBarMixin' | ||||
| import TabBarMixin from './TabBarMixin' | ||||
| 
 | ||||
| export default { | ||||
|   name: 'ScrollableTabBar', | ||||
|   mixins: [TabBarMixin, ScrollableTabBarMixin], | ||||
|   render () { | ||||
|     const inkBarNode = this.getInkBarNode() | ||||
|     const tabs = this.getTabs() | ||||
|     const scrollbarNode = this.getScrollBarNode([inkBarNode, tabs]) | ||||
|     return this.getRootNode(scrollbarNode) | ||||
|   }, | ||||
| } | ||||
| </script> | ||||
| 
 | ||||
|  | @ -0,0 +1,288 @@ | |||
| import { setTransform, isTransformSupported } from './utils' | ||||
| import addDOMEventListener from 'add-dom-event-listener' | ||||
| import debounce from 'lodash.debounce' | ||||
| function noop () { | ||||
| } | ||||
| export default { | ||||
|   props: { | ||||
|     scrollAnimated: { type: Boolean, default: true }, | ||||
|     onPrevClick: { type: Function, default: noop }, | ||||
|     onNextClick: { type: Function, default: noop }, | ||||
|   }, | ||||
| 
 | ||||
|   data () { | ||||
|     return { | ||||
|       next: false, | ||||
|       prev: false, | ||||
|       offset: 0, | ||||
|     } | ||||
|   }, | ||||
| 
 | ||||
|   mounted () { | ||||
|     this.updatedCal() | ||||
|     const debouncedResize = debounce(() => { | ||||
|       this.setNextPrev() | ||||
|       this.scrollToActiveTab() | ||||
|     }, 200) | ||||
|     this.resizeEvent = addDOMEventListener(window, 'resize', debouncedResize) | ||||
|   }, | ||||
| 
 | ||||
|   updated (prevProps) { | ||||
|     const props = this.$props | ||||
|     if (prevProps && prevProps.tabBarPosition !== props.tabBarPosition) { | ||||
|       this.setOffset(0) | ||||
|       return | ||||
|     } | ||||
|     const nextPrev = this.setNextPrev() | ||||
|     // wait next, prev show hide
 | ||||
|     if (this.isNextPrevShown(this) !== this.isNextPrevShown(nextPrev)) { | ||||
|       Object.assign(this, this.scrollToActiveTab) | ||||
|     } else if (!prevProps || props.activeKey !== prevProps.activeKey) { | ||||
|       // can not use props.activeKey
 | ||||
|       this.scrollToActiveTab() | ||||
|     } | ||||
|   }, | ||||
| 
 | ||||
|   beforeDestroy () { | ||||
|     if (this.resizeEvent) { | ||||
|       this.resizeEvent.remove() | ||||
|     } | ||||
|   }, | ||||
|   methods: { | ||||
|     updatedCal () { | ||||
| 
 | ||||
|     }, | ||||
|     setNextPrev () { | ||||
|       const navNode = this.nav | ||||
|       const navNodeWH = this.getOffsetWH(navNode) | ||||
|       const navWrapNode = this.navWrap | ||||
|       const navWrapNodeWH = this.getOffsetWH(navWrapNode) | ||||
|       let { offset } = this | ||||
|       const minOffset = navWrapNodeWH - navNodeWH | ||||
|       let { next, prev } = this | ||||
|       if (minOffset >= 0) { | ||||
|         next = false | ||||
|         this.setOffset(0, false) | ||||
|         offset = 0 | ||||
|       } else if (minOffset < offset) { | ||||
|         next = (true) | ||||
|       } else { | ||||
|         next = (false) | ||||
|         this.setOffset(minOffset, false) | ||||
|         offset = minOffset | ||||
|       } | ||||
| 
 | ||||
|       if (offset < 0) { | ||||
|         prev = (true) | ||||
|       } else { | ||||
|         prev = (false) | ||||
|       } | ||||
| 
 | ||||
|       this.setNext(next) | ||||
|       this.setPrev(prev) | ||||
|       return { | ||||
|         next, | ||||
|         prev, | ||||
|       } | ||||
|     }, | ||||
| 
 | ||||
|     getOffsetWH (node) { | ||||
|       const tabBarPosition = this.$props.tabBarPosition | ||||
|       let prop = 'offsetWidth' | ||||
|       if (tabBarPosition === 'left' || tabBarPosition === 'right') { | ||||
|         prop = 'offsetHeight' | ||||
|       } | ||||
|       return node[prop] | ||||
|     }, | ||||
| 
 | ||||
|     getOffsetLT (node) { | ||||
|       const tabBarPosition = this.$props.tabBarPosition | ||||
|       let prop = 'left' | ||||
|       if (tabBarPosition === 'left' || tabBarPosition === 'right') { | ||||
|         prop = 'top' | ||||
|       } | ||||
|       return node.getBoundingClientRect()[prop] | ||||
|     }, | ||||
| 
 | ||||
|     setOffset (offset, checkNextPrev = true) { | ||||
|       const target = Math.min(0, offset) | ||||
|       if (this.offset !== target) { | ||||
|         this.offset = target | ||||
|         let navOffset = {} | ||||
|         const tabBarPosition = this.$props.tabBarPosition | ||||
|         const navStyle = this.nav.style | ||||
|         const transformSupported = isTransformSupported(navStyle) | ||||
|         if (tabBarPosition === 'left' || tabBarPosition === 'right') { | ||||
|           if (transformSupported) { | ||||
|             navOffset = { | ||||
|               value: `translate3d(0,${target}px,0)`, | ||||
|             } | ||||
|           } else { | ||||
|             navOffset = { | ||||
|               name: 'top', | ||||
|               value: `${target}px`, | ||||
|             } | ||||
|           } | ||||
|         } else { | ||||
|           if (transformSupported) { | ||||
|             navOffset = { | ||||
|               value: `translate3d(${target}px,0,0)`, | ||||
|             } | ||||
|           } else { | ||||
|             navOffset = { | ||||
|               name: 'left', | ||||
|               value: `${target}px`, | ||||
|             } | ||||
|           } | ||||
|         } | ||||
|         if (transformSupported) { | ||||
|           setTransform(navStyle, navOffset.value) | ||||
|         } else { | ||||
|           navStyle[navOffset.name] = navOffset.value | ||||
|         } | ||||
|         if (checkNextPrev) { | ||||
|           this.setNextPrev() | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
| 
 | ||||
|     setPrev (v) { | ||||
|       if (this.prev !== v) { | ||||
|         this.prev = v | ||||
|       } | ||||
|     }, | ||||
| 
 | ||||
|     setNext (v) { | ||||
|       if (this.next !== v) { | ||||
|         this.next = v | ||||
|       } | ||||
|     }, | ||||
| 
 | ||||
|     isNextPrevShown (state) { | ||||
|       if (state) { | ||||
|         return state.next || state.prev | ||||
|       } | ||||
|       return this.next || this.prev | ||||
|     }, | ||||
| 
 | ||||
|     prevTransitionEnd (e) { | ||||
|       if (e.propertyName !== 'opacity') { | ||||
|         return | ||||
|       } | ||||
|       const { container } = this | ||||
|       this.scrollToActiveTab({ | ||||
|         target: container, | ||||
|         currentTarget: container, | ||||
|       }) | ||||
|     }, | ||||
| 
 | ||||
|     scrollToActiveTab (e) { | ||||
|       const { activeTab, navWrap } = this | ||||
|       if (e && e.target !== e.currentTarget || !activeTab) { | ||||
|         return | ||||
|       } | ||||
| 
 | ||||
|       // when not scrollable or enter scrollable first time, don't emit scrolling
 | ||||
|       const needToSroll = this.isNextPrevShown() && this.lastNextPrevShown | ||||
|       this.lastNextPrevShown = this.isNextPrevShown() | ||||
|       if (!needToSroll) { | ||||
|         return | ||||
|       } | ||||
| 
 | ||||
|       const activeTabWH = this.getOffsetWH(activeTab) | ||||
|       const navWrapNodeWH = this.getOffsetWH(navWrap) | ||||
|       let { offset } = this | ||||
|       const wrapOffset = this.getOffsetLT(navWrap) | ||||
|       const activeTabOffset = this.getOffsetLT(activeTab) | ||||
|       if (wrapOffset > activeTabOffset) { | ||||
|         offset += (wrapOffset - activeTabOffset) | ||||
|         this.setOffset(offset) | ||||
|       } else if ((wrapOffset + navWrapNodeWH) < (activeTabOffset + activeTabWH)) { | ||||
|         offset -= (activeTabOffset + activeTabWH) - (wrapOffset + navWrapNodeWH) | ||||
|         this.setOffset(offset) | ||||
|       } | ||||
|     }, | ||||
| 
 | ||||
|     prevClick (e) { | ||||
|       this.$props.onPrevClick(e) | ||||
|       const navWrapNode = this.navWrap | ||||
|       const navWrapNodeWH = this.getOffsetWH(navWrapNode) | ||||
|       const { offset } = this | ||||
|       this.setOffset(offset + navWrapNodeWH) | ||||
|     }, | ||||
| 
 | ||||
|     nextClick (e) { | ||||
|       this.$props.onNextClick(e) | ||||
|       const navWrapNode = this.navWrap | ||||
|       const navWrapNodeWH = this.getOffsetWH(navWrapNode) | ||||
|       const { offset } = this | ||||
|       this.setOffset(offset - navWrapNodeWH) | ||||
|     }, | ||||
| 
 | ||||
|     getScrollBarNode (content) { | ||||
|       const { next, prev } = this | ||||
|       const { prefixCls, scrollAnimated } = this.$props | ||||
|       const showNextPrev = prev || next | ||||
| 
 | ||||
|       const prevButton = ( | ||||
|         <span | ||||
|           onClick={prev ? this.prevClick : noop} | ||||
|           unselectable='unselectable' | ||||
|           class={{ | ||||
|             [`${prefixCls}-tab-prev`]: 1, | ||||
|             [`${prefixCls}-tab-btn-disabled`]: !prev, | ||||
|             [`${prefixCls}-tab-arrow-show`]: showNextPrev, | ||||
|           }} | ||||
|           onTransitionEnd={this.prevTransitionEnd} | ||||
|         > | ||||
|           <span class={`${prefixCls}-tab-prev-icon`} /> | ||||
|         </span> | ||||
|       ) | ||||
| 
 | ||||
|       const nextButton = ( | ||||
|         <span | ||||
|           onClick={next ? this.nextClick : noop} | ||||
|           unselectable='unselectable' | ||||
|           class={{ | ||||
|             [`${prefixCls}-tab-next`]: 1, | ||||
|             [`${prefixCls}-tab-btn-disabled`]: !next, | ||||
|             [`${prefixCls}-tab-arrow-show`]: showNextPrev, | ||||
|           }} | ||||
|         > | ||||
|           <span class={`${prefixCls}-tab-next-icon`} /> | ||||
|         </span> | ||||
|       ) | ||||
| 
 | ||||
|       const navClassName = `${prefixCls}-nav` | ||||
|       const navClasses = { | ||||
|         [navClassName]: true, | ||||
|         [ | ||||
|         scrollAnimated | ||||
|           ? `${navClassName}-animated` | ||||
|           : `${navClassName}-no-animated` | ||||
|         ]: true, | ||||
|       } | ||||
| 
 | ||||
|       return ( | ||||
|         <div | ||||
|           class={{ | ||||
|             [`${prefixCls}-nav-container`]: 1, | ||||
|             [`${prefixCls}-nav-container-scrolling`]: showNextPrev, | ||||
|           }} | ||||
|           key='container' | ||||
|           ref='container' | ||||
|         > | ||||
|           {prevButton} | ||||
|           {nextButton} | ||||
|           <div class={`${prefixCls}-nav-wrap`} ref='navWrap'> | ||||
|             <div class={`${prefixCls}-nav-scroll`}> | ||||
|               <div class={navClasses} ref='nav'> | ||||
|                 {content} | ||||
|               </div> | ||||
|             </div> | ||||
|           </div> | ||||
|         </div> | ||||
|       ) | ||||
|     }, | ||||
|   }, | ||||
| } | ||||
|  | @ -1,4 +1,25 @@ | |||
| export default { | ||||
|   props: { | ||||
|     prefixCls: { | ||||
|       default: 'ant-tabs', | ||||
|       type: String, | ||||
|     }, | ||||
|     tabBarPosition: { | ||||
|       default: 'top', | ||||
|       type: String, | ||||
|     }, | ||||
|     disabled: Boolean, | ||||
|     onKeyDown: { | ||||
|       default: () => {}, | ||||
|       type: Function, | ||||
|     }, | ||||
|     onTabClick: { | ||||
|       default: () => {}, | ||||
|       type: Function, | ||||
|     }, | ||||
|     activeKey: String, | ||||
|     panels: Array, | ||||
|   }, | ||||
|   methods: { | ||||
|     getTabs () { | ||||
|       const { panels: children, activeKey, prefixCls } = this | ||||
|  |  | |||
|  | @ -3,6 +3,7 @@ import Icon from '../icon' | |||
| import KeyCode from './KeyCode' | ||||
| import TabBar from './TabBar' | ||||
| import TabContent from './TabContent' | ||||
| import ScrollableInkTabBar from './ScrollableInkTabBar' | ||||
| function getDefaultActiveKey (t) { | ||||
|   let activeKey | ||||
|   t.$slot.default.forEach((child) => { | ||||
|  | @ -34,6 +35,11 @@ export default { | |||
|         return ['top', 'bottom', 'left', 'right'].includes(value) | ||||
|       }, | ||||
|     }, | ||||
|     renderTabBar: { | ||||
|       type: Function, | ||||
|       default: () => {}, | ||||
|     }, | ||||
|     tabBarProps: Object, | ||||
|     destroyInactiveTabPane: Boolean, | ||||
|     activeKey: String, | ||||
|     defaultActiveKey: String, | ||||
|  | @ -162,6 +168,7 @@ export default { | |||
|     } | ||||
|     const tabBarProps = { | ||||
|       props: { | ||||
|         ...tabBarProps, | ||||
|         panels: panels, | ||||
|         prefixCls: prefixCls, | ||||
|         onKeyDown: onNavKeyDown, | ||||
|  | @ -172,9 +179,9 @@ export default { | |||
|       }, | ||||
|     } | ||||
|     const contents = [ | ||||
|       <TabBar {...tabBarProps}> | ||||
|       <ScrollableInkTabBar {...tabBarProps}> | ||||
|         {this.$slots.tabBarExtraContent} | ||||
|       </TabBar>, | ||||
|       </ScrollableInkTabBar>, | ||||
|       <TabContent {...tabContentProps}> | ||||
|         {$slots.default} | ||||
|       </TabContent>, | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| import Tabs from './Tabs' | ||||
| import Tabs from './index.vue' | ||||
| import TabPane from './TabPane' | ||||
| // import TabContent from './TabContent'
 | ||||
| import TabContent from './TabContent' | ||||
| Tabs.TabPane = TabPane | ||||
| export default Tabs | ||||
| export { TabPane } | ||||
| export { TabPane, TabContent } | ||||
|  |  | |||
|  | @ -0,0 +1,179 @@ | |||
| <script> | ||||
| import Tabs from './Tabs' | ||||
| // import TabPane from './TabPane' | ||||
| import ScrollableInkTabBar from './ScrollableInkTabBar' | ||||
| import TabBar from './TabBar' | ||||
| import TabContent from './TabContent' | ||||
| import Icon from '../icon' | ||||
| import isFlexSupported from '../_util/isFlexSupported' | ||||
| export default { | ||||
|   props: { | ||||
|     prefixCls: { type: String, default: 'ant-tabs' }, | ||||
|     activeKey: String, | ||||
|     defaultActiveKey: String, | ||||
|     hideAdd: { type: Boolean, default: false }, | ||||
|     onChange: { type: Function, default: () => {} }, | ||||
|     onTabClick: { type: Function, default: () => {} }, | ||||
|     onPrevClick: { type: Function, default: () => {} }, | ||||
|     onNextClick: { type: Function, default: () => {} }, | ||||
|     tabBarStyle: Object, | ||||
|     type: { | ||||
|       validator (value) { | ||||
|         return ['line', 'card', 'editable-card'].includes(value) | ||||
|       }, | ||||
|     }, | ||||
|     tabPosition: { | ||||
|       validator (value) { | ||||
|         return ['top', 'right', 'bottom', 'left'].includes(value) | ||||
|       }, | ||||
|     }, | ||||
|     onEdit: { type: Function, default: () => {} }, | ||||
|     size: { | ||||
|       validator (value) { | ||||
|         return ['default', 'small'].includes(value) | ||||
|       }, | ||||
|     }, | ||||
|     animated: Boolean | Object, | ||||
|   }, | ||||
|   methods: { | ||||
|     createNewTab (targetKey) { | ||||
|       const onEdit = this.$props.onEdit | ||||
|       if (onEdit) { | ||||
|         onEdit(targetKey, 'add') | ||||
|       } | ||||
|     }, | ||||
| 
 | ||||
|     removeTab (targetKey, e) { | ||||
|       e.stopPropagation() | ||||
|       if (!targetKey) { | ||||
|         return | ||||
|       } | ||||
| 
 | ||||
|       const onEdit = this.$props.onEdit | ||||
|       if (onEdit) { | ||||
|         onEdit(targetKey, 'remove') | ||||
|       } | ||||
|     }, | ||||
| 
 | ||||
|     handleChange (activeKey) { | ||||
|       const onChange = this.$props.onChange | ||||
|       if (onChange) { | ||||
|         onChange(activeKey) | ||||
|       } | ||||
|     }, | ||||
|   }, | ||||
| 
 | ||||
|   mounted () { | ||||
|     const NO_FLEX = ' no-flex' | ||||
|     const tabNode = this.$el | ||||
|     if (tabNode && !isFlexSupported() && tabNode.className.indexOf(NO_FLEX) === -1) { | ||||
|       tabNode.className += NO_FLEX | ||||
|     } | ||||
|   }, | ||||
| 
 | ||||
|   render () { | ||||
|     const { | ||||
|       prefixCls, | ||||
|       size, | ||||
|       type = 'line', | ||||
|       tabPosition, | ||||
|       children, | ||||
|       tabBarStyle, | ||||
|       // hideAdd, | ||||
|       onTabClick, | ||||
|       onPrevClick, | ||||
|       onNextClick, | ||||
|       animated = true, | ||||
|     } = this.$props | ||||
|     let { tabBarExtraContent } = this.$props | ||||
|     let { inkBarAnimated, tabPaneAnimated } = typeof animated === 'object' ? { // eslint-disable-line | ||||
|       inkBarAnimated: animated.inkBar, tabPaneAnimated: animated.tabPane, | ||||
|     } : { | ||||
|       inkBarAnimated: animated, tabPaneAnimated: animated, | ||||
|     } | ||||
| 
 | ||||
|     // card tabs should not have animation | ||||
|     if (type !== 'line') { | ||||
|       tabPaneAnimated = 'animated' in this.$props ? tabPaneAnimated : false | ||||
|     } | ||||
|     const cls = { | ||||
|       [`${prefixCls}-mini`]: size === 'small' || size, | ||||
|       [`${prefixCls}-vertical`]: tabPosition === 'left' || tabPosition === 'right', | ||||
|       [`${prefixCls}-card`]: type.indexOf('card') >= 0, | ||||
|       [`${prefixCls}-${type}`]: true, | ||||
|       [`${prefixCls}-no-animation`]: !tabPaneAnimated, | ||||
|     } | ||||
|     // only card type tabs can be added and closed | ||||
|     let childrenWithClose | ||||
|     // if (type === 'editable-card') { | ||||
|     //   childrenWithClose = [] | ||||
|     //   React.Children.forEach(children, (child, index) => { | ||||
|     //     let closable = child.props.closable | ||||
|     //     closable = typeof closable === 'undefined' ? true : closable | ||||
|     //     const closeIcon = closable ? ( | ||||
|     //       <Icon | ||||
|     //         type='close' | ||||
|     //         onClick={e => this.removeTab(child.key, e)} | ||||
|     //       /> | ||||
|     //     ) : null | ||||
|     //     childrenWithClose.push(cloneElement(child, { | ||||
|     //       tab: ( | ||||
|     //         <div className={closable ? undefined : `${prefixCls}-tab-unclosable`}> | ||||
|     //           {child.props.tab} | ||||
|     //           {closeIcon} | ||||
|     //         </div> | ||||
|     //       ), | ||||
|     //       key: child.key || index, | ||||
|     //     })) | ||||
|     //   }) | ||||
|     //   // Add new tab handler | ||||
|     //   if (!hideAdd) { | ||||
|     //     tabBarExtraContent = ( | ||||
|     //       <span> | ||||
|     //         <Icon type='plus' className={`${prefixCls}-new-tab`} onClick={this.createNewTab} /> | ||||
|     //         {tabBarExtraContent} | ||||
|     //       </span> | ||||
|     //     ) | ||||
|     //   } | ||||
|     // } | ||||
| 
 | ||||
|     tabBarExtraContent = tabBarExtraContent ? ( | ||||
|       <div class={`${prefixCls}-extra-content`}> | ||||
|         {tabBarExtraContent} | ||||
|       </div> | ||||
|     ) : null | ||||
| 
 | ||||
|     const renderTabBar = () => ( | ||||
|       <ScrollableInkTabBar | ||||
|         inkBarAnimated={inkBarAnimated} | ||||
|         extraContent={tabBarExtraContent} | ||||
|         onTabClick={onTabClick} | ||||
|         onPrevClick={onPrevClick} | ||||
|         onNextClick={onNextClick} | ||||
|         style={tabBarStyle} | ||||
|       /> | ||||
|     ) | ||||
|     const tabBarProps = { | ||||
|       inkBarAnimated, | ||||
|       extraContent: tabBarExtraContent, | ||||
|       onTabClick, | ||||
|       onPrevClick, | ||||
|       onNextClick, | ||||
|       style: tabBarStyle, | ||||
|     } | ||||
|     return ( | ||||
|       <Tabs | ||||
|         {...this.$props} | ||||
|         class={cls} | ||||
|         tabBarPosition={tabPosition} | ||||
|         renderTabBar={renderTabBar} | ||||
|         // renderTabContent={() => <TabContent animated={tabPaneAnimated} animatedWithMargin />} | ||||
|         onChange={this.handleChange} | ||||
|         tabBarProps={tabBarProps} | ||||
|       > | ||||
|         {childrenWithClose || this.$slots.default} | ||||
|       </Tabs> | ||||
|     ) | ||||
|   }, | ||||
| } | ||||
| </script> | ||||
|  | @ -74,6 +74,8 @@ | |||
|     "webpack-dev-server": "^2.8.2" | ||||
|   }, | ||||
|   "dependencies": { | ||||
|     "eslint-plugin-vue": "^3.13.0" | ||||
|     "add-dom-event-listener": "^1.0.2", | ||||
|     "eslint-plugin-vue": "^3.13.0", | ||||
|     "lodash.debounce": "^4.0.8" | ||||
|   } | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 tangjinzhou
						tangjinzhou