253 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			Vue
		
	
	
			
		
		
	
	
			253 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			Vue
		
	
	
| <script>
 | |
| import Trigger from '../index';
 | |
| import '../assets/index.less';
 | |
| import { Input, Button } from 'ant-design-vue';
 | |
| 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: 'rc-trigger-popup-zoom',
 | |
|       destroyPopupOnHide: false,
 | |
|       destroyed: 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>
 | |
|             <a-checkbox
 | |
|               value="rc-trigger-popup-zoom"
 | |
|               onChange={this.onTransitionChange}
 | |
|               checked={state.transitionName === 'rc-trigger-popup-zoom'}
 | |
|             />
 | |
|             transitionName
 | |
|           </label>
 | |
|                trigger:
 | |
|           <label>
 | |
|             <a-checkbox value="hover" checked={!!trigger.hover} onChange={this.onTriggerChange} />
 | |
|             hover
 | |
|           </label>
 | |
|           <label>
 | |
|             <a-checkbox value="focus" checked={!!trigger.focus} onChange={this.onTriggerChange} />
 | |
|             focus
 | |
|           </label>
 | |
|           <label>
 | |
|             <a-checkbox value="click" checked={!!trigger.click} onChange={this.onTriggerChange} />
 | |
|             click
 | |
|           </label>
 | |
|           <label>
 | |
|             <a-checkbox
 | |
|               value="contextMenu"
 | |
|               checked={!!trigger.contextMenu}
 | |
|               onChange={this.onTriggerChange}
 | |
|             />
 | |
|             contextMenu
 | |
|           </label>
 | |
|               
 | |
|           <label>
 | |
|             <a-checkbox
 | |
|               checked={!!state.destroyPopupOnHide}
 | |
|               onChange={this.handleDestroyPopupOnHide}
 | |
|             />
 | |
|             destroyPopupOnHide
 | |
|           </label>
 | |
|               
 | |
|           <label>
 | |
|             <a-checkbox checked={!!state.mask} onChange={this.onMask} />
 | |
|             mask
 | |
|           </label>
 | |
|               
 | |
|           <label>
 | |
|             <a-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}
 | |
|             popupAnimation={state.transitionName}
 | |
|           >
 | |
|             <div
 | |
|               slot="popup"
 | |
|               style={{ border: '1px solid red', padding: '10px', background: 'white' }}
 | |
|             >
 | |
|               i am a popup
 | |
|             </div>
 | |
|             <a-button onClick={preventDefault}>trigger</a-button>
 | |
|           </Trigger>
 | |
|         </div>
 | |
|       </div>
 | |
|     );
 | |
|   },
 | |
| };
 | |
| </script>
 |