281 lines
6.2 KiB
Vue
281 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>
|