fix[Waves-Directive]: fixed v-waves does not support update (#1705)

This commit is contained in:
裤裆三重奏 2019-03-13 15:26:09 +08:00 committed by 花裤衩
parent 9574643e92
commit cf48ed218b
1 changed files with 64 additions and 33 deletions

View File

@ -1,14 +1,18 @@
import './waves.css' import './waves.css'
export default{ const context = '@@wavesContext'
bind(el, binding) {
el.addEventListener('click', e => { function handleClick(el, binding) {
function handle(e) {
const customOpts = Object.assign({}, binding.value) const customOpts = Object.assign({}, binding.value)
const opts = Object.assign({ const opts = Object.assign(
{
ele: el, // 波纹作用元素 ele: el, // 波纹作用元素
type: 'hit', // hit 点击位置扩散 center中心点扩展 type: 'hit', // hit 点击位置扩散 center中心点扩展
color: 'rgba(0, 0, 0, 0.15)' // 波纹颜色 color: 'rgba(0, 0, 0, 0.15)' // 波纹颜色
}, customOpts) },
customOpts
)
const target = opts.ele const target = opts.ele
if (target) { if (target) {
target.style.position = 'relative' target.style.position = 'relative'
@ -25,18 +29,45 @@ export default{
} }
switch (opts.type) { switch (opts.type) {
case 'center': case 'center':
ripple.style.top = (rect.height / 2 - ripple.offsetHeight / 2) + 'px' ripple.style.top = rect.height / 2 - ripple.offsetHeight / 2 + 'px'
ripple.style.left = (rect.width / 2 - ripple.offsetWidth / 2) + 'px' ripple.style.left = rect.width / 2 - ripple.offsetWidth / 2 + 'px'
break break
default: default:
ripple.style.top = (e.pageY - rect.top - ripple.offsetHeight / 2 - document.documentElement.scrollTop || document.body.scrollTop) + 'px' ripple.style.top =
ripple.style.left = (e.pageX - rect.left - ripple.offsetWidth / 2 - document.documentElement.scrollLeft || document.body.scrollLeft) + 'px' (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.style.backgroundColor = opts.color
ripple.className = 'waves-ripple z-active' ripple.className = 'waves-ripple z-active'
return false return false
} }
}, false)
} }
if (!el[context]) {
el[context] = {
removeHandle: handle
}
} else {
el[context].removeHandle = handle
}
return handle
} }
export default {
bind(el, binding) {
el.addEventListener('click', handleClick(el, binding), false)
},
update(el, binding) {
el.removeEventListener('click', el[context].removeHandle, false)
el.addEventListener('click', handleClick(el, binding), false)
},
unbind(el) {
el.removeEventListener('click', el[context].removeHandle, false)
el[context] = null
delete el[context]
}
}