vue指令總結
阿新 • • 發佈:2020-08-12
1. 指令週期
指令有5個生命週期
bind 指令繫結後,只執行一次,適合初始化
inserted 元素插入父節點後
update 元件VNode更新時
componentUpdated 元件VNode及其子VNode更新後呼叫
unbind 只執行一次,指令與元素解綁時
2. 生命週期引數說明
el:指令所繫結的元素,可以用來直接操作 DOM。
binding:一個物件,包含以下 property:
name:指令名,不包括 v- 字首。
value:指令的繫結值,例如:v-my-directive="1 + 1" 中,繫結值為 2。
expression:字串形式的指令表示式。例如 v-my-directive="1 + 1" 中,表示式為 "1 + 1"。
arg:傳給指令的引數,可選。例如 v-my-directive:foo 中,引數為 "foo"。
modifiers:一個包含修飾符的物件。例如:v-my-directive.foo.bar 中,修飾符物件為 { foo: true, bar: true }。
vnode:Vue 編譯生成的虛擬節點。移步 VNode API 來了解更多詳情。
3. 週期簡寫
指令通常寫法
Vue.directive('color-swatch', {
bind(){...}
update(){...}
unbind(){...}
})
如果bind和update總是相同,可以簡寫為一個函式
Vue.directive('color-swatch', function (el, binding) { ... })
4. 經典場景
4.1 實現元素的visibility的隱藏功能
//以外掛的形式暴露指令,可以方便的以use的方式來引入指令const oVisible = { install(Vue) { //全域性註冊在指令 Vue.directive('visible', (el, binding) => { var value = binding.value; if (!!value) { el.style.visibility = 'visible'; } else { el.style.visibility = 'hidden'; } }); } }; if (typeof window !== 'undefined' && window.Vue) { window.Vue.use(oVisible); } export default oVisible;
使用
import VueVisible from 'vue-visible';
Vue.use(VueVisible);
<div v-visible="shouldVisible">測試例子</div>
4.2 實現點選元素外部執行方法,clickOutSide功能
Vue.directive('clickoutside',{ bind(el, binding, vnode) { function onDocumentClick(e) { if (el.contains(e.target)) { return false } if (binding.expression) { binding.value(e) } } el.__vueClickOutside__ = onDocumentClick document.addEventListener('click', onDocumentClick) }, unbind(el, binding) { document.removeEventListener('click', el.__vueClickOutside__) delete el.__vueClickOutside__ } })