vue#DirectiveOptions TypeScript Examples
The following examples show how to use
vue#DirectiveOptions.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: index.ts From vue-element-typescript-admin with MIT License | 6 votes |
permission: DirectiveOptions = {
inserted(el, binding) {
const { value } = binding
const roles = UserModule.roles
if (value && value instanceof Array && value.length > 0) {
const permissionRoles = value
const hasPermission = roles.some(role => {
return permissionRoles.includes(role)
})
if (!hasPermission) {
el?.parentNode?.removeChild(el)
}
} else {
throw new Error(`need roles! Like v-permission="['admin','editor']"`)
}
}
}
Example #2
Source File: index.ts From vue-element-typescript-admin with MIT License | 5 votes |
clipboard: DirectiveOptions = {
bind(el, binding) {
if (binding.arg === 'success') {
successCallback = binding.value
} else if (binding.arg === 'error') {
errorCallback = binding.value
} else {
clipboardInstance = new Clipboard(el, {
text() {
return binding.value
},
action() {
return binding.arg === 'cut' ? 'cut' : 'copy'
}
})
clipboardInstance.on('success', e => {
successCallback?.(e)
})
clipboardInstance.on('error', e => {
errorCallback?.(e)
})
}
},
update(el, binding) {
if (binding.arg === 'success') {
successCallback = binding.value
} else if (binding.arg === 'error') {
errorCallback = binding.value
} else {
clipboardInstance = new Clipboard(el, {
text() {
return binding.value
},
action() {
return binding.arg === 'cut' ? 'cut' : 'copy'
}
})
}
},
unbind(_, binding) {
if (binding.arg === 'success') {
successCallback = null
} else if (binding.arg === 'error') {
errorCallback = null
} else {
if (clipboardInstance) {
clipboardInstance.destroy()
}
clipboardInstance = null
}
}
}
Example #3
Source File: index.ts From vue-element-typescript-admin with MIT License | 5 votes |
elDraggableDialog: DirectiveOptions = {
bind(el, _, vnode) {
const dragDom = el.querySelector('.el-dialog') as HTMLElement
const dialogHeaderEl = el.querySelector('.el-dialog__header') as HTMLElement
dragDom.style.cssText += ';top:0px;'
dialogHeaderEl.style.cssText += ';cursor:move;'
dialogHeaderEl.onmousedown = (e) => {
const disX = e.clientX - dialogHeaderEl.offsetLeft
const disY = e.clientY - dialogHeaderEl.offsetTop
const dragDomWidth = dragDom.offsetWidth
const dragDomHeight = dragDom.offsetHeight
const screenWidth = document.body.clientWidth
const screenHeight = document.body.clientHeight
const minDragDomLeft = dragDom.offsetLeft
const maxDragDomLeft = screenWidth - dragDom.offsetLeft - dragDomWidth
const minDragDomTop = dragDom.offsetTop
const maxDragDomTop = screenHeight - dragDom.offsetTop - dragDomHeight
const styleLeftStr = getComputedStyle(dragDom)['left']
const styleTopStr = getComputedStyle(dragDom)['top']
if (!styleLeftStr || !styleTopStr) return
let styleLeft: number
let styleTop: number
// Format may be "##%" or "##px"
if (styleLeftStr.includes('%')) {
styleLeft = +document.body.clientWidth * (+styleLeftStr.replace(/%/g, '') / 100)
styleTop = +document.body.clientHeight * (+styleTopStr.replace(/%/g, '') / 100)
} else {
styleLeft = +styleLeftStr.replace(/px/g, '')
styleTop = +styleTopStr.replace(/px/g, '')
}
document.onmousemove = (e) => {
let left = e.clientX - disX
let top = e.clientY - disY
// Handle edge cases
if (-(left) > minDragDomLeft) {
left = -minDragDomLeft
} else if (left > maxDragDomLeft) {
left = maxDragDomLeft
}
if (-(top) > minDragDomTop) {
top = -minDragDomTop
} else if (top > maxDragDomTop) {
top = maxDragDomTop
}
// Move current element
dragDom.style.cssText += `;left:${left + styleLeft}px;top:${top + styleTop}px;`
// Emit onDialogDrag event
// See https://stackoverflow.com/questions/49264426/vuejs-custom-directive-emit-event
if (vnode.componentInstance) {
vnode.componentInstance.$emit('onDialogDrag')
} else if (vnode.elm) {
vnode.elm.dispatchEvent(new CustomEvent('onDialogDrag'))
}
}
document.onmouseup = () => {
document.onmousemove = null
document.onmouseup = null
}
}
}
}
Example #4
Source File: index.ts From vue-element-typescript-admin with MIT License | 5 votes |
waves: DirectiveOptions = {
bind(el, binding) {
el.addEventListener('click', e => {
const customOpts = Object.assign({}, binding.value)
const opts = Object.assign({
ele: el, // 波纹作用元素
type: 'hit', // hit 点击位置扩散 center中心点扩展
color: 'rgba(0, 0, 0, 0.15)' // 波纹颜色
}, customOpts)
const target: HTMLElement = opts.ele
if (target) {
target.style.position = 'relative'
target.style.overflow = 'hidden'
const rect = target.getBoundingClientRect()
let ripple = target.querySelector('.waves-ripple') as HTMLElement
if (!ripple) {
ripple = document.createElement('span')
ripple.className = 'waves-ripple'
ripple.style.height = ripple.style.width = Math.max(rect.width, rect.height) + 'px'
target.appendChild(ripple)
} else {
ripple.className = 'waves-ripple'
}
switch (opts.type) {
case 'center':
ripple.style.top = rect.height / 2 - ripple.offsetHeight / 2 + 'px'
ripple.style.left = rect.width / 2 - ripple.offsetWidth / 2 + 'px'
break
default:
ripple.style.top =
(e.pageY - rect.top - ripple.offsetHeight / 2 - document.documentElement.scrollTop ||
document.body.scrollTop) + 'px'
ripple.style.left =
(e.pageX - rect.left - ripple.offsetWidth / 2 - document.documentElement.scrollLeft ||
document.body.scrollLeft) + 'px'
}
ripple.style.backgroundColor = opts.color
ripple.className = 'waves-ripple z-active'
return false
}
}, false)
}
}
Example #5
Source File: main.ts From vue-element-typescript-admin with MIT License | 5 votes |
// Register global directives
Object.keys(directives).forEach(key => {
Vue.directive(key, (directives as { [key: string]: DirectiveOptions })[key])
})