Skip to content
This repository was archived by the owner on Nov 30, 2020. It is now read-only.

Commit e853751

Browse files
authored
feat: update v-ripple directive (#364)
bind `mdcRipple` to the el which makes it available for user to activate or deactivate using binding value on native html element
1 parent ac36b03 commit e853751

File tree

3 files changed

+23
-12
lines changed

3 files changed

+23
-12
lines changed

components/ripple/README.md

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,6 @@ Material Components Vue provides a customized directive `v-ripple` to provide an
4949

5050
### Activate or deactivate using binding value
5151

52-
Notice that this usage can only be applied to Vue components instead of native elements like `<div>`, `<button>`.
53-
5452
```html
5553
<template>
5654
<my-button v-ripple.primary="activate">Button</my-button>

components/ripple/index.js

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,28 @@ const plugin = {
1818
install (vm) {
1919
vm.component('m-ripple', Ripple)
2020
vm.directive('ripple', {
21-
bind: function (el, binding, vnode) {
21+
bind: function (el, binding) {
2222
const mdcRipple = setup(el, binding)
23-
if (vnode.componentInstance && !binding.modifiers['css-only']) vnode.componentInstance.mdcRipple = mdcRipple
23+
if (!binding.modifiers['css-only']) {
24+
Object.defineProperty(el, 'mdcRipple', {
25+
configurable: true,
26+
enumerable: false,
27+
value: mdcRipple,
28+
writable: false
29+
})
30+
}
2431
},
25-
componentUpdated: function (el, binding, vnode) {
26-
vnode.componentInstance && typeof binding.oldValue === 'boolean' && typeof binding.value === 'boolean' && binding.oldValue !== binding.value && binding.value
27-
? vnode.componentInstance.mdcRipple.activate()
28-
: vnode.componentInstance.mdcRipple.deactivate()
32+
componentUpdated: function (el, binding) {
33+
if (typeof binding.oldValue === 'boolean' && typeof binding.value === 'boolean' && binding.oldValue !== binding.value && binding.value) {
34+
if (el.mdcRipple) el.mdcRipple.activate()
35+
} else {
36+
if (el.mdcRipple) el.mdcRipple.deactivate()
37+
}
2938
},
30-
unbind: function (el, binding, vnode) {
31-
if (vnode.componentInstance && vnode.componentInstance.mdcRipple) vnode.componentInstance.mdcRipple.destroy()
39+
unbind: function (el) {
40+
if (el.mdcRipple) {
41+
el.mdcRipple.destroy()
42+
}
3243
}
3344
})
3445
}

docs/.vuepress/components/RippleDemo.vue

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22
<div>
33
<ComponentSection flex-direction="column">
44
<my-button v-if="checkboxProps[0].value" v-ripple.primary="radioProps[0].value"/>
5-
<my-button v-if="checkboxProps[1].value" v-ripple.accent="radioProps[0].value"/>
5+
<button style="width: 100px; height: 40px; background: deepskyblue; outline: none; border: none; color: white; border-radius: 4px;" v-if="checkboxProps[1].value" v-ripple.accent="radioProps[0].value">BUTTON</button>
6+
<my-button v-ripple.primary.css-only v-if="checkboxProps[2].value"/>
67
</ComponentSection>
78
<ComponentProps
89
:checkboxProps="checkboxProps"
@@ -23,7 +24,8 @@
2324
],
2425
checkboxProps: [
2526
{ prop: 'primary', value: false },
26-
{ prop: 'accent', value: true }
27+
{ prop: 'accent', value: true },
28+
{ prop: 'css-only', value: false}
2729
]
2830
}
2931
}

0 commit comments

Comments
 (0)