fix
							parent
							
								
									2e07f98d40
								
							
						
					
					
						commit
						b9fe970682
					
				|  | @ -1,12 +1,13 @@ | |||
| import clonedeep from 'lodash.clonedeep' | ||||
| export function cloneVNode (vnode, deep) { | ||||
|   const cloned = new vnode.constructor( | ||||
|     vnode.tag, | ||||
|     vnode.data, | ||||
|     clonedeep(vnode.data), | ||||
|     vnode.children, | ||||
|     vnode.text, | ||||
|     vnode.elm, | ||||
|     vnode.context, | ||||
|     vnode.componentOptions, | ||||
|     clonedeep(vnode.componentOptions), | ||||
|     vnode.asyncFactory | ||||
|   ) | ||||
|   cloned.ns = vnode.ns | ||||
|  | @ -30,7 +31,7 @@ export function cloneVNodes (vnodes, deep) { | |||
| } | ||||
| 
 | ||||
| export function cloneElement (node, nodeProps) { | ||||
|   const { props, key, ref } = nodeProps | ||||
|   const { props, key } = nodeProps | ||||
|   if (node.componentOptions) { | ||||
|     Object.assign(node.componentOptions.propsData, props) | ||||
|   } | ||||
|  | @ -40,7 +41,7 @@ export function cloneElement (node, nodeProps) { | |||
|     attrs = data.attrs, | ||||
|     on = data.on, | ||||
|   } = nodeProps | ||||
|   Object.assign(node.data, { style, attrs, class: cls, on }) | ||||
|   node.data = Object.assign(data, { style, attrs, class: cls, on }) | ||||
|   if (key !== undefined) { | ||||
|     node.key = key | ||||
|   } | ||||
|  |  | |||
|  | @ -1,11 +1,14 @@ | |||
| import warning from 'warning' | ||||
| 
 | ||||
| const warned = {} | ||||
| export default (valid, message) => { | ||||
| export default (valid, message, throwError) => { | ||||
|   if (process.env.NODE_ENV !== 'production') { | ||||
|     if (!valid && !warned[message]) { | ||||
|       warning(false, message) | ||||
|       warned[message] = true | ||||
|       if (throwError) { | ||||
|         throw Error(message) | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  |  | |||
|  | @ -1,5 +1,5 @@ | |||
| <script> | ||||
| import PropTypes from 'vue-types' | ||||
| import PropTypes from '../_util/vue-types' | ||||
| import align from 'dom-align' | ||||
| import clonedeep from 'lodash.clonedeep' | ||||
| import addEventListener from '../_util/Dom/addEventListener' | ||||
|  |  | |||
|  | @ -39,7 +39,7 @@ export default { | |||
|     return ( | ||||
|       <div | ||||
|         style={{ | ||||
|           margin: 50, | ||||
|           margin: '50px', | ||||
|         }} | ||||
|       > | ||||
|         <p> | ||||
|  |  | |||
|  | @ -43,6 +43,8 @@ export default { | |||
|       const { value } = this.$props | ||||
|       if (value === undefined) { | ||||
|         this.stateValue = e.target.value | ||||
|         this.$emit('change.value', e.target.value) | ||||
|         this.$emit('change', e) | ||||
|       } else { | ||||
|         this.$forceUpdate() | ||||
|         this.$emit('change.value', e.target.value) | ||||
|  |  | |||
|  | @ -209,7 +209,7 @@ | |||
| 
 | ||||
| // Animation | ||||
| @animation-duration-slow: .3s; // Modal | ||||
| @animation-duration-base: .2s; | ||||
| @animation-duration-base: 20s; | ||||
| @animation-duration-fast: .1s; // Tooltip | ||||
| 
 | ||||
| // Form | ||||
|  |  | |||
|  | @ -1,5 +1,5 @@ | |||
| <script> | ||||
| import PropTypes from 'vue-types' | ||||
| import PropTypes from '../_util/vue-types' | ||||
| 
 | ||||
| export default { | ||||
|   props: { | ||||
|  |  | |||
|  | @ -13,11 +13,18 @@ export default { | |||
|     destroyPopupOnHide: PropTypes.bool, | ||||
|     prefixCls: PropTypes.string, | ||||
|     getContainer: PropTypes.func, | ||||
|     transitionName: PropTypes.string, | ||||
|     animation: PropTypes.any, | ||||
|     maskAnimation: PropTypes.string, | ||||
|     maskTransitionName: PropTypes.string, | ||||
|     mask: PropTypes.bool, | ||||
|     zIndex: PropTypes.number, | ||||
|   }, | ||||
|   mounted () { | ||||
|     this.rootNode = this.getPopupDomNode() | ||||
|     this._container = this.getContainer() | ||||
|     this._container.appendChild(this.$el) | ||||
|     // this._container.appendChild(this.$el) | ||||
|     // this.$refs.alignInstance.forceAlign() | ||||
|   }, | ||||
|   beforeDestroy () { | ||||
|     this._container && this._container.parentNode.removeChild(this._container) | ||||
|  | @ -37,7 +44,7 @@ export default { | |||
|     }, | ||||
| 
 | ||||
|     getPopupDomNode () { | ||||
|       return this.$refs.popupInstance | ||||
|       return this.$refs.popupInstance ? this.$refs.popupInstance.$el : null | ||||
|     }, | ||||
| 
 | ||||
|     getTarget () { | ||||
|  | @ -60,7 +67,7 @@ export default { | |||
|       if (!transitionName && props.animation) { | ||||
|         transitionName = `${props.prefixCls}-${props.animation}` | ||||
|       } | ||||
|       return transitionName | ||||
|       return 'fade' | ||||
|     }, | ||||
| 
 | ||||
|     getClassName (currentAlignClassName) { | ||||
|  | @ -116,16 +123,16 @@ export default { | |||
|           </Align>) : null} | ||||
|         </transition>) | ||||
|       } | ||||
|       popupInnerProps.props.hiddenClassName = hiddenClassName | ||||
|       popupInnerProps.props.hiddenClassName = 'hiddenClassName' | ||||
|       return (<transition | ||||
|         name={this.getTransitionName()} | ||||
|       > | ||||
|         <Align | ||||
|           v-show={visible} | ||||
|           target={this.getTarget} | ||||
|           key='popup' | ||||
|           ref='alignInstance' | ||||
|           monitorWindowResize | ||||
|           childrenProps={{ visible }} | ||||
|           disabled={!visible} | ||||
|           align={align} | ||||
|           onAlign={this.onAlign} | ||||
|  | @ -181,9 +188,20 @@ export default { | |||
|       <div> | ||||
|         {this.getMaskElement()} | ||||
|         {this.getPopupElement()} | ||||
|         <transition name='fade'> | ||||
|           <div v-show={this.visible}>hello</div> | ||||
|         </transition> | ||||
|       </div> | ||||
|     ) | ||||
|   }, | ||||
|   // render () { | ||||
|   //   return ( | ||||
|   //     <transition name='fade'> | ||||
|   //       <div v-show={this.visible}>hello</div> | ||||
|   //     </transition> | ||||
|   //   ) | ||||
|   // }, | ||||
| } | ||||
| 
 | ||||
| </script> | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,5 +1,5 @@ | |||
| <script> | ||||
| import PropTypes from 'vue-types' | ||||
| import PropTypes from '../_util/vue-types' | ||||
| import LazyRenderBox from './LazyRenderBox' | ||||
| 
 | ||||
| export default { | ||||
|  |  | |||
|  | @ -1,5 +1,10 @@ | |||
| @triggerPrefixCls: rc-trigger-popup; | ||||
| 
 | ||||
| .fade-enter-active, .fade-leave-active { | ||||
|   transition: opacity 0.5s; | ||||
| } | ||||
| .fade-enter, .fade-leave-to /* .fade-leave-active in below version 2.1.8 */ { | ||||
|   opacity: 0; | ||||
| } | ||||
| .@{triggerPrefixCls} { | ||||
|   position: absolute; | ||||
|   left: -9999px; | ||||
|  |  | |||
|  | @ -36,19 +36,49 @@ const popupBorderStyle = { | |||
| export default { | ||||
|   render () { | ||||
|     return ( | ||||
|       <div style={{ margin: '200px' }}> | ||||
|         <div> | ||||
|         <div style={{ margin: '50px' }}> | ||||
|           <Trigger | ||||
|             popupPlacement='right' | ||||
|             popupPlacement='left' | ||||
|             action={['click']} | ||||
|             builtinPlacements={builtinPlacements} | ||||
|           > | ||||
|             <div slot='popup' style={popupBorderStyle}>i am a click popup</div> | ||||
|             <span> | ||||
|               <div ref='saveContainerRef1' /> | ||||
|               <Trigger | ||||
|                 popupPlacement='bottom' | ||||
|                 action={['hover']} | ||||
|                 builtinPlacements={builtinPlacements} | ||||
|                 getPopupContainer={() => this.$refs.saveContainerRef1} | ||||
|               > | ||||
|                 <div slot='popup' style={popupBorderStyle}>i am a hover popup</div> | ||||
|                 <span href='#' style={{ margin: '20px' }}>trigger</span> | ||||
|               </Trigger> | ||||
|             </span> | ||||
|           </Trigger> | ||||
|         </div> | ||||
|         { false ? <div style={{ margin: '50px' }}> | ||||
|           <Trigger | ||||
|             popupPlacement='right' | ||||
|             action={['click', 'hover']} | ||||
|             builtinPlacements={builtinPlacements} | ||||
|           > | ||||
|             <div style={popupBorderStyle} slot='popup' onClick={(e) => { e.stopPropagation() }}> | ||||
|               jjj | ||||
|               <div ref='saveContainerRef' /> | ||||
|               <Trigger | ||||
|                 popupPlacement='bottom' | ||||
|                 action={['click']} | ||||
|                 builtinPlacements={builtinPlacements} | ||||
|                 getPopupContainer={() => this.$refs.saveContainerRef} | ||||
|               > | ||||
|                 <div slot='popup' style={popupBorderStyle}>I am inner Trigger Popup</div> | ||||
|                 <span href='#' style={{ margin: 20 }}>clickToShowInnerTrigger</span> | ||||
|               </Trigger> | ||||
|             </div> | ||||
|             <span href='#' style={{ margin: '20px' }} onClick={console.log}>trigger</span> | ||||
|           </Trigger> | ||||
|         </div> | ||||
|         </div> : null} | ||||
|       </div> | ||||
|     ) | ||||
|   }, | ||||
|  |  | |||
|  | @ -0,0 +1,279 @@ | |||
| <script> | ||||
| import Trigger from '../index' | ||||
| import '../assets/index.less' | ||||
| import { Input, Button, Checkbox } from 'antd' | ||||
| function getPopupAlign (state) { | ||||
|   return { | ||||
|     offset: [state.offsetX, state.offsetY], | ||||
|     overflow: { | ||||
|       adjustX: 1, | ||||
|       adjustY: 1, | ||||
|     }, | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| const builtinPlacements = { | ||||
|   left: { | ||||
|     points: ['cr', 'cl'], | ||||
|   }, | ||||
|   right: { | ||||
|     points: ['cl', 'cr'], | ||||
|   }, | ||||
|   top: { | ||||
|     points: ['bc', 'tc'], | ||||
|   }, | ||||
|   bottom: { | ||||
|     points: ['tc', 'bc'], | ||||
|   }, | ||||
|   topLeft: { | ||||
|     points: ['bl', 'tl'], | ||||
|   }, | ||||
|   topRight: { | ||||
|     points: ['br', 'tr'], | ||||
|   }, | ||||
|   bottomRight: { | ||||
|     points: ['tr', 'br'], | ||||
|   }, | ||||
|   bottomLeft: { | ||||
|     points: ['tl', 'bl'], | ||||
|   }, | ||||
| } | ||||
| 
 | ||||
| function preventDefault (e) { | ||||
|   e.preventDefault() | ||||
| } | ||||
| 
 | ||||
| function getPopupContainer (trigger) { | ||||
|   return trigger.parentNode | ||||
| } | ||||
| 
 | ||||
| export default { | ||||
|   data () { | ||||
|     return { | ||||
|       mask: false, | ||||
|       maskClosable: false, | ||||
|       placement: 'right', | ||||
|       trigger: { | ||||
|         hover: 1, | ||||
|       }, | ||||
|       offsetX: undefined, | ||||
|       offsetY: undefined, | ||||
|       transitionName: '', | ||||
|       destroyPopupOnHide: false, | ||||
|     } | ||||
|   }, | ||||
|   methods: { | ||||
|     setState (state, callback) { | ||||
|       Object.assign(this.$data, state) | ||||
|       this.$nextTick(() => { | ||||
|         callback && callback() | ||||
|       }) | ||||
|     }, | ||||
|     onPlacementChange (e) { | ||||
|       this.setState({ | ||||
|         placement: e.target.value, | ||||
|       }) | ||||
|     }, | ||||
| 
 | ||||
|     onTransitionChange (e) { | ||||
|       this.setState({ | ||||
|         transitionName: e.target.checked ? e.target.value : '', | ||||
|       }) | ||||
|     }, | ||||
| 
 | ||||
|     onTriggerChange (e) { | ||||
|       const trigger = Object.assign({}, this.$data.trigger) | ||||
|       if (e.target.checked) { | ||||
|         trigger[e.target.value] = 1 | ||||
|       } else { | ||||
|         delete trigger[e.target.value] | ||||
|       } | ||||
|       this.setState({ | ||||
|         trigger, | ||||
|       }) | ||||
|     }, | ||||
| 
 | ||||
|     onOffsetXChange (e) { | ||||
|       const targetValue = e.target.value | ||||
|       this.setState({ | ||||
|         offsetX: targetValue || undefined, | ||||
|       }) | ||||
|     }, | ||||
| 
 | ||||
|     onOffsetYChange (e) { | ||||
|       const targetValue = e.target.value | ||||
|       this.setState({ | ||||
|         offsetY: targetValue || undefined, | ||||
|       }) | ||||
|     }, | ||||
| 
 | ||||
|     onVisibleChange (visible) { | ||||
|       console.log('tooltip', visible) | ||||
|     }, | ||||
| 
 | ||||
|     onMask (e) { | ||||
|       this.setState({ | ||||
|         mask: e.target.checked, | ||||
|       }) | ||||
|     }, | ||||
| 
 | ||||
|     onMaskClosable (e) { | ||||
|       this.setState({ | ||||
|         maskClosable: e.target.checked, | ||||
|       }) | ||||
|     }, | ||||
| 
 | ||||
|     destroy () { | ||||
|       this.setState({ | ||||
|         destroyed: true, | ||||
|       }) | ||||
|     }, | ||||
| 
 | ||||
|     handleDestroyPopupOnHide (e) { | ||||
|       this.setState({ | ||||
|         destroyPopupOnHide: e.target.checked, | ||||
|       }) | ||||
|     }, | ||||
|   }, | ||||
| 
 | ||||
|   render () { | ||||
|     const state = this.$data | ||||
|     const trigger = state.trigger | ||||
|     if (state.destroyed) { | ||||
|       return null | ||||
|     } | ||||
|     return (<div > | ||||
|       <div style={{ margin: '10px 20px' }}> | ||||
|         <label> | ||||
|           placement: | ||||
|           <select value={state.placement} onChange={this.onPlacementChange}> | ||||
|             <option>right</option> | ||||
|             <option>left</option> | ||||
|             <option>top</option> | ||||
|             <option>bottom</option> | ||||
|             <option>topLeft</option> | ||||
|             <option>topRight</option> | ||||
|             <option>bottomRight</option> | ||||
|             <option>bottomLeft</option> | ||||
|           </select> | ||||
|         </label> | ||||
|              | ||||
|         <label> | ||||
|           <Checkbox | ||||
|             value='rc-trigger-popup-zoom' | ||||
|             onChange={this.onTransitionChange} | ||||
|             checked={state.transitionName === 'rc-trigger-popup-zoom'} | ||||
|           /> | ||||
|           transitionName | ||||
|         </label> | ||||
| 
 | ||||
|              | ||||
| 
 | ||||
|         trigger: | ||||
| 
 | ||||
|         <label> | ||||
|           <Checkbox | ||||
|             value='hover' | ||||
|             checked={!!trigger.hover} | ||||
|             onChange={this.onTriggerChange} | ||||
|           /> | ||||
|           hover | ||||
|         </label> | ||||
|         <label> | ||||
|           <Checkbox | ||||
|             value='focus' | ||||
|             checked={!!trigger.focus} | ||||
|             onChange={this.onTriggerChange} | ||||
|           /> | ||||
|           focus | ||||
|         </label> | ||||
|         <label> | ||||
|           <Checkbox | ||||
|             value='click' | ||||
|             checked={!!trigger.click} | ||||
|             onChange={this.onTriggerChange} | ||||
|           /> | ||||
|           click | ||||
|         </label> | ||||
|         <label> | ||||
|           <Checkbox | ||||
|             value='contextMenu' | ||||
|             checked={!!trigger.contextMenu} | ||||
|             onChange={this.onTriggerChange} | ||||
|           /> | ||||
|           contextMenu | ||||
|         </label> | ||||
|              | ||||
|         <label> | ||||
|           <Checkbox | ||||
|             checked={!!state.destroyPopupOnHide} | ||||
|             onChange={this.handleDestroyPopupOnHide} | ||||
|           /> | ||||
|           destroyPopupOnHide | ||||
|         </label> | ||||
| 
 | ||||
|              | ||||
|         <label> | ||||
|           <Checkbox | ||||
|             checked={!!state.mask} | ||||
|             onChange={this.onMask} | ||||
|           /> | ||||
|           mask | ||||
|         </label> | ||||
| 
 | ||||
|              | ||||
|         <label> | ||||
|           <Checkbox | ||||
|             checked={!!state.maskClosable} | ||||
|             onChange={this.onMaskClosable} | ||||
|           /> | ||||
|           maskClosable | ||||
|         </label> | ||||
| 
 | ||||
|         <br /> | ||||
|         <label> | ||||
|           offsetX: | ||||
|           <Input | ||||
|             type='text' | ||||
|             onChange={this.onOffsetXChange} | ||||
|             style={{ width: '50px' }} | ||||
|           /> | ||||
|         </label> | ||||
|              | ||||
|         <label> | ||||
|           offsetY: | ||||
|           <Input | ||||
|             type='text' | ||||
|             onChange={this.onOffsetYChange} | ||||
|             style={{ width: '50px' }} | ||||
|           /> | ||||
|         </label> | ||||
|              | ||||
|         <Button onClick={this.destroy}>destroy</Button> | ||||
|       </div> | ||||
|       <div style={{ margin: '100px', position: 'relative' }}> | ||||
|         <Trigger | ||||
|           getPopupContainer={undefined && getPopupContainer} | ||||
|           popupAlign={getPopupAlign(state)} | ||||
|           popupPlacement={state.placement} | ||||
|           destroyPopupOnHide={state.destroyPopupOnHide} | ||||
|           // zIndex={40} | ||||
|           mask={state.mask} | ||||
|           maskClosable={state.maskClosable} | ||||
|           // maskAnimation="fade" | ||||
|           // mouseEnterDelay={0.1} | ||||
|           // mouseLeaveDelay={0.1} | ||||
|           action={Object.keys(state.trigger)} | ||||
|           builtinPlacements={builtinPlacements} | ||||
|           popupTransitionName={state.transitionName} | ||||
|         > | ||||
|           <div slot='popup' style={{ border: '1px solid red', padding: '10px', background: 'white' }}> | ||||
|               i am a popup | ||||
|           </div> | ||||
|           <a href='#' style={{ margin: '20px' }} onClick={preventDefault}>trigger</a> | ||||
|         </Trigger> | ||||
|       </div> | ||||
|     </div>) | ||||
|   }, | ||||
| } | ||||
| </script> | ||||
|  | @ -0,0 +1,160 @@ | |||
| ## API | ||||
| 
 | ||||
| ### props | ||||
| 
 | ||||
| <table class="table table-bordered table-striped"> | ||||
|     <thead> | ||||
|     <tr> | ||||
|         <th style="width: 100px;">name</th> | ||||
|         <th style="width: 50px;">type</th> | ||||
|         <th style="width: 50px;">default</th> | ||||
|         <th>description</th> | ||||
|     </tr> | ||||
|     </thead> | ||||
|     <tbody> | ||||
|         <tr> | ||||
|           <td>popupClassName</td> | ||||
|           <td>string</td> | ||||
|           <td></td> | ||||
|           <td>additional className added to popup</td> | ||||
|         </tr> | ||||
|         <tr> | ||||
|           <td>forceRender</td> | ||||
|           <td>boolean</td> | ||||
|           <td>false</td> | ||||
|           <td>whether render popup before first show</td> | ||||
|         </tr> | ||||
|         <tr> | ||||
|           <td>destroyPopupOnHide</td> | ||||
|           <td>boolean</td> | ||||
|           <td>false</td> | ||||
|           <td>whether destroy popup when hide</td> | ||||
|         </tr> | ||||
|         <tr> | ||||
|           <td>getPopupClassNameFromAlign</td> | ||||
|           <td>getPopupClassNameFromAlign(align: Object):String</td> | ||||
|           <td></td> | ||||
|           <td>additional className added to popup according to align</td> | ||||
|         </tr> | ||||
|         <tr> | ||||
|           <td>action</td> | ||||
|           <td>string[]</td> | ||||
|           <td>['hover']</td> | ||||
|           <td>which actions cause popup shown. enum of 'hover','click','focus','contextMenu'</td> | ||||
|         </tr> | ||||
|         <tr> | ||||
|           <td>mouseEnterDelay</td> | ||||
|           <td>number</td> | ||||
|           <td>0</td> | ||||
|           <td>delay time to show when mouse enter. unit: s.</td> | ||||
|         </tr> | ||||
|         <tr> | ||||
|           <td>mouseLeaveDelay</td> | ||||
|           <td>number</td> | ||||
|           <td>0.1</td> | ||||
|           <td>delay time to hide when mouse leave. unit: s.</td> | ||||
|         </tr> | ||||
|         <tr> | ||||
|           <td>popupStyle</td> | ||||
|           <td>Object</td> | ||||
|           <td></td> | ||||
|           <td>additional style of popup</td> | ||||
|         </tr> | ||||
|         <tr> | ||||
|           <td>prefixCls</td> | ||||
|           <td>String</td> | ||||
|           <td>rc-trigger-popup</td> | ||||
|           <td>prefix class name</td> | ||||
|         </tr> | ||||
|         <tr> | ||||
|           <td>popupTransitionName</td> | ||||
|           <td>String|Object</td> | ||||
|           <td></td> | ||||
|           <td>https://github.com/react-component/animate</td> | ||||
|         </tr> | ||||
|         <tr> | ||||
|           <td>maskTransitionName</td> | ||||
|           <td>String|Object</td> | ||||
|           <td></td> | ||||
|           <td>https://github.com/react-component/animate</td> | ||||
|         </tr> | ||||
|         <tr> | ||||
|           <td>mask</td> | ||||
|           <td>boolean</td> | ||||
|           <td>false</td> | ||||
|           <td>whether to support mask</td> | ||||
|         </tr> | ||||
|         <tr> | ||||
|           <td>maskClosable</td> | ||||
|           <td>boolean</td> | ||||
|           <td>true</td> | ||||
|           <td>whether to support click mask to hide</td> | ||||
|         </tr> | ||||
|         <tr> | ||||
|           <td>popupVisible</td> | ||||
|           <td>boolean</td> | ||||
|           <td></td> | ||||
|           <td>whether popup is visible</td> | ||||
|         </tr> | ||||
|         <tr> | ||||
|           <td>zIndex</td> | ||||
|           <td>number</td> | ||||
|           <td></td> | ||||
|           <td>popup's zIndex</td> | ||||
|         </tr> | ||||
|         <tr> | ||||
|           <td>defaultPopupVisible</td> | ||||
|           <td>boolean</td> | ||||
|           <td></td> | ||||
|           <td>whether popup is visible initially</td> | ||||
|         </tr> | ||||
|         <tr> | ||||
|           <td>popupAlign</td> | ||||
|           <td>Object: alignConfig of [dom-align](https://github.com/yiminghe/dom-align)</td> | ||||
|           <td></td> | ||||
|           <td>popup 's align config</td> | ||||
|         </tr> | ||||
|         <tr> | ||||
|           <td>getPopupContainer</td> | ||||
|           <td>getPopupContainer(): HTMLElement</td> | ||||
|           <td></td> | ||||
|           <td>function returning html node which will act as popup container</td> | ||||
|         </tr> | ||||
|         <tr> | ||||
|           <td>getDocument</td> | ||||
|           <td>getDocument(): HTMLElement</td> | ||||
|           <td></td> | ||||
|           <td>function returning document node which will be attached click event to close trigger</td> | ||||
|         </tr> | ||||
|         <tr> | ||||
|           <td>popupPlacement</td> | ||||
|           <td>string</td> | ||||
|           <td></td> | ||||
|           <td>use preset popup align config from builtinPlacements, can be merged by popupAlign prop</td> | ||||
|         </tr> | ||||
|         <tr> | ||||
|           <td>builtinPlacements</td> | ||||
|           <td>object</td> | ||||
|           <td></td> | ||||
|           <td>builtin placement align map. used by placement prop</td> | ||||
|         </tr> | ||||
|         <tr> | ||||
|           <td>popupVisibleChange</td> | ||||
|           <td>$emit(visible)</td> | ||||
|           <td></td> | ||||
|           <td>call when popup visible is changed</td> | ||||
|         </tr> | ||||
|         <tr> | ||||
|           <td>popupAlign</td> | ||||
|           <td>$emit(popupDomNode, align)</td> | ||||
|           <td></td> | ||||
|           <td>callback when popup node is aligned</td> | ||||
|         </tr> | ||||
|         <tr> | ||||
|           <td>popup</td> | ||||
|           <td>slot='popup'</td> | ||||
|           <td></td> | ||||
|           <td>popup content</td> | ||||
|         </tr> | ||||
|     </tbody> | ||||
| </table> | ||||
|  | @ -2,11 +2,11 @@ | |||
| import PropTypes from '../_util/vue-types' | ||||
| import contains from '../_util/Dom/contains' | ||||
| import addEventListener from '../_util/Dom/addEventListener' | ||||
| import warning from '../_util/warning' | ||||
| import Popup from './Popup' | ||||
| import { getAlignFromPlacement, getPopupClassNameFromAlign } from './utils' | ||||
| import getContainerRenderMixin from '../_util/getContainerRenderMixin' | ||||
| import StateMixin from '../_util/StateMixin' | ||||
| import { cloneElement } from '../_util/vnode' | ||||
| import { cloneElement, cloneVNode } from '../_util/vnode' | ||||
| 
 | ||||
| function returnEmptyString () { | ||||
|   return '' | ||||
|  | @ -19,26 +19,6 @@ function returnDocument () { | |||
| const ALL_HANDLERS = ['click', 'mousedown', 'touchStart', 'mouseenter', | ||||
|   'mouseleave', 'focus', 'blur', 'contextMenu'] | ||||
| 
 | ||||
| const mixins = [] | ||||
| 
 | ||||
| mixins.push( | ||||
|   getContainerRenderMixin({ | ||||
|     autoMount: false, | ||||
| 
 | ||||
|     isVisible (instance) { | ||||
|       return instance.$data.sPopupVisible | ||||
|     }, | ||||
| 
 | ||||
|     isForceRender (instance) { | ||||
|       return instance.$props.forceRender | ||||
|     }, | ||||
| 
 | ||||
|     getContainer (instance) { | ||||
|       return instance.getContainer() | ||||
|     }, | ||||
|   }) | ||||
| ) | ||||
| 
 | ||||
| export default { | ||||
|   name: 'Trigger', | ||||
|   props: { | ||||
|  | @ -65,7 +45,7 @@ export default { | |||
|     zIndex: PropTypes.number, | ||||
|     focusDelay: PropTypes.number.def(0), | ||||
|     blurDelay: PropTypes.number.def(0.15), | ||||
|     getPopupContainer: Function, | ||||
|     getPopupContainer: PropTypes.func, | ||||
|     getDocument: PropTypes.func.def(returnDocument), | ||||
|     forceRender: PropTypes.bool, | ||||
|     destroyPopupOnHide: PropTypes.bool.def(false), | ||||
|  | @ -74,15 +54,15 @@ export default { | |||
|     // onPopupAlign: PropTypes.func, | ||||
|     popupAlign: PropTypes.object.def({}), | ||||
|     popupVisible: PropTypes.bool, | ||||
|     // defaultPopupVisible: PropTypes.bool.def(false), | ||||
|     // maskTransitionName: PropTypes.oneOfType([ | ||||
|     //   PropTypes.string, | ||||
|     //   PropTypes.object, | ||||
|     // ]), | ||||
|     // maskAnimation: PropTypes.string, | ||||
|     defaultPopupVisible: PropTypes.bool.def(false), | ||||
|     maskTransitionName: PropTypes.oneOfType([ | ||||
|       PropTypes.string, | ||||
|       PropTypes.object, | ||||
|     ]), | ||||
|     maskAnimation: PropTypes.string, | ||||
|   }, | ||||
| 
 | ||||
|   mixins: [StateMixin, ...mixins], | ||||
|   mixins: [StateMixin], | ||||
|   data () { | ||||
|     const props = this.$props | ||||
|     let popupVisible | ||||
|  | @ -184,9 +164,9 @@ export default { | |||
| 
 | ||||
|     onPopupMouseleave (e) { | ||||
|       if (e.relatedTarget && !e.relatedTarget.setTimeout && | ||||
|       this._component && | ||||
|       this._component.getPopupDomNode && | ||||
|       contains(this._component.getPopupDomNode(), e.relatedTarget)) { | ||||
|       this.$refs.popup && | ||||
|       this.$refs.popup.getPopupDomNode && | ||||
|       contains(this.$refs.popup.getPopupDomNode(), e.relatedTarget)) { | ||||
|         return | ||||
|       } | ||||
|       this.delaySetPopupVisible(false, this.$props.mouseLeaveDelay) | ||||
|  | @ -271,8 +251,8 @@ export default { | |||
|     }, | ||||
|     getPopupDomNode () { | ||||
|     // for test | ||||
|       if (this._component && this._component.getPopupDomNode) { | ||||
|         return this._component.getPopupDomNode() | ||||
|       if (this.$refs.popup && this.$refs.popup.getPopupDomNode) { | ||||
|         return this.$refs.popup.getPopupDomNode() | ||||
|       } | ||||
|       return null | ||||
|     }, | ||||
|  | @ -426,15 +406,17 @@ export default { | |||
| 
 | ||||
|     createTwoChains (event) { | ||||
|       const child = this.$slots.default[0] | ||||
|       let fn = () => {} | ||||
|       if (child && child.data && child.data.on) { | ||||
|       let fn = () => { | ||||
|         console.log('event', event) | ||||
|       } | ||||
|       child.data = child.data || {} | ||||
|       child.data.on = child.data.on || {} | ||||
|       const childEvents = child.data.on | ||||
|       const events = (this.data ? this.data.on : {}) || {} | ||||
|       if (childEvents[event] && events[event]) { | ||||
|         return this[`fire${event}`] | ||||
|       } | ||||
|       fn = childEvents[event] || events[event] || fn | ||||
|       } | ||||
|       return fn | ||||
|     }, | ||||
| 
 | ||||
|  | @ -473,14 +455,15 @@ export default { | |||
|       return action.indexOf('focus') !== -1 || hideAction.indexOf('blur') !== -1 | ||||
|     }, | ||||
|     forcePopupAlign () { | ||||
|       if (this.$data.sPopupVisible && this._component && this._component.$refs.alignInstance) { | ||||
|         this._component.$refs.alignInstance.forceAlign() | ||||
|       if (this.$data.sPopupVisible && this.$refs.popup && this.$refs.popup.$refs.alignInstance) { | ||||
|         this.$refs.popup.$refs.alignInstance.forceAlign() | ||||
|       } | ||||
|     }, | ||||
|     fireEvents (type, e) { | ||||
|       const child = this.$slots.default[0] | ||||
|       if (child && child.data && child.on && child.on[type]) { | ||||
|         child.on[type](e) | ||||
|       if (child && child.data && child.data.on && child.data.on[type]) { | ||||
|         console.log(type, child.data.on[type]) | ||||
|         // child.data.on[type](e) | ||||
|       } | ||||
|       if (this.data && this.data.on && this.data.on[type]) { | ||||
|         this.data.on[type](e) | ||||
|  | @ -493,6 +476,9 @@ export default { | |||
|   }, | ||||
|   render () { | ||||
|     const children = this.$slots.default | ||||
|     if (children.length > 1) { | ||||
|       warning(false, 'Trigger $slots.default.length > 1, just support only one default', true) | ||||
|     } | ||||
|     const child = children[0] | ||||
|     const newChildProps = { | ||||
|       props: {}, | ||||
|  | @ -533,12 +519,17 @@ export default { | |||
|       newChildProps.on.blur = this.createTwoChains('blur') | ||||
|     } | ||||
| 
 | ||||
|     const trigger = cloneElement(child, newChildProps) | ||||
| 
 | ||||
|     const trigger = cloneElement(cloneVNode(child), newChildProps) | ||||
|     const { sPopupVisible, forceRender } = this | ||||
|     if (sPopupVisible || forceRender || this._component) { | ||||
|       this._component = this.getComponent() | ||||
|     } else { | ||||
|       this._component = null | ||||
|     } | ||||
|     return ( | ||||
|       <span> | ||||
|         {trigger} | ||||
|         {this.getComponent()} | ||||
|         {this._component} | ||||
|       </span> | ||||
|     ) | ||||
|   }, | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 tangjinzhou
						tangjinzhou