前言
本篇博客是基于vue3.0 的自定义指令开发教程,(有版本变化会持续更新)其中会列出如何使用以及与vue2.0 的自定义指令的对比。
一, Vue3.0 自定义指令教程
demo中,包含一个很简单的一键复制指令,不需要再下载插件,很好用的
先看看 vue3.0官方文档如何介绍: 官方文档传送门
自定义指令的作用:主要是为了重用涉及普通元素的的底层DOM的访问逻辑
自定义指令可以局部注册也可以全局注册,再平时开发过程中使用较多的是全局自定义指令。
一:局部注册
直接上代码,一目了然
<template>
<input type="text" name="" v-focus value="">
</template>
<script>
const focus = {
mounted: (el) => {
el.focus();
}
}
export default {
directives: {
focus
},
data() {
return {}
},
}
</script>
二:全局注册
1. 在src 目录下新建文件directives 目录,里边建index.js 文件
文件内容如下
const directives = {
install: ((app) => {
app.directive('selfcolor', (el, binding) => {
el.style.color = binding.value;
});
app.directive('selfCopy', (el, binding) => {
el.onclick = () => {
console.log(binding.value)
if (!binding.value) {
alert('不能复制空文本');
return false;
}
navigator.clipboard.writeText(binding.value);
alert('复制成功')
}
});
app.directive('objectParams', (el, binding) => {
console.log(binding.value)
console.log(binding.arg)
});
app.directive('arrayParams', (el, binding) => {
console.log(binding.value[1])
});
app.directive('testLifeCycle', {
created(el, binding, vnode, prevVnode) {
},
beforeMount(el, binding, vnode, prevVnode) {},
mounted(el, binding, vnode, prevVnode) {
console.log(binding);
console.log(binding.modifiers);
if (Object.keys(binding.modifiers).length == 0) {
alert('说明没有传修饰符');
return false;
}
alert('说明传了修饰符')
},
beforeUpdate(el, binding, vnode, prevVnode) {},
updated(el, binding, vnode, prevVnode) {},
beforeUnmount(el, binding, vnode, prevVnode) {},
unmounted(el, binding, vnode, prevVnode) {}
});
})
}
export default directives;
2. 在main.js 文件中注册
import { createApp } from 'vue'
import App from './App.vue'
const app = createApp(App);
import selfDirectives from './directives/index.js';
app.use(selfDirectives);
app.mount('#app');
如上,注册完毕,就可以在整个项目中使用了。
3. 在页面中使用
<template>
<div class="main" v-selfcolor="color">测试自定义指令 </div>
<input type="button" name="" v-selfCopy="text" value="复制按钮">
<input type="text" name="" v-focus value="">
指令内传对象以及arg 传递给指令的参数
<div v-objectParams:argVariable="{color:'blue',name:'张三'}">指令内传对象</div>
<div v-arrayParams="[{
name:'张三',
age:13
},{
name:'李四',
age:12
}]">指令内传数组</div>
<div v-testLifeCycle.selfModifiers="'测试生命周期'">测试生命周期</div>
</template>
<script>
export default {
data() {
return {
color: 'red',
}
},
}
</script>
<style scoped>
</style>
二, 自定义指令钩子生命周期和钩子参数
生命周期 | 何时调用 | 参数 |
---|
created | 在绑定元素的 attribute 前或事件监听器应用前调用 | el, binding, vnode, prevVnode | beforeMount | 在元素被插入到 DOM 前调用 | el, binding, vnode, prevVnode | mounted | 在绑定元素的父组件及他自己的所有子节点都挂载完成后调用 | el, binding, vnode, prevVnode | beforeUpdate | 绑定元素的父组件更新前调用 | el, binding, vnode, prevVnode | updated | 在绑定元素的父组件及他自己的所有子节点都更新后调用 | el, binding, vnode, prevVnode | beforeUnmount | 绑定元素的父组件卸载前调用 | el, binding, vnode, prevVnode | unmounted | 绑定元素的父组件卸载后调用 | el, binding, vnode, prevVnode |
钩子参数 | 作用 |
---|
el | 指令绑定到的元素。这可以用于直接操作 DOM。 | binding | 一个对象,包含以下属性。 | binding.value | 传递给指令的值。例如在 v-my-directive=“1 + 1” 中,值是 2。 | binding.oldValue | 之前的值,仅在 beforeUpdate 和 updated 中可用。无论值是否更改,它都可用。 | binding.arg | :传递给指令的参数 (如果有的话)。例如在 v-my-directive:foo 中,参数是 “foo”。 | binding.modifiers | 一个包含修饰符的对象 (如果有的话)。例如在 v-my-directive.foo.bar 中,修饰符对象是 { foo: true, bar: true }。 | binding.instance | 使用该指令的组件实例。 | binding.dir | 指令的定义对象。 | vnode | 代表绑定元素的底层 VNode。 | prevNode | 之前的渲染中代表指令所绑定元素的 VNode。仅在 beforeUpdate 和 updated 钩子中可用。 |
三,Vue3.0自定义指令和2.0自定义指令的异同?
生命周期不同,钩子函数参数不同
以下列出vue2.0 的指令的钩子函数和钩子函数参数,请自行与上文中的3.0的对比
vue2.0钩子函数
生命周期 | 何时调用 | 参数 |
---|
bind | 只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。 | el, binding, vnode, oldVnode | inserted | 被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已被插入文档中)。 | el, binding, vnode, oldVnode | update | 所在组件的 VNode 更新时调用,但是可能发生在其子 VNode 更新之前。指令的值可能发生了改变,也可能没有 | el, binding, vnode, oldVnode | componentUpdated | 指令所在组件的 VNode 及其子 VNode 全部更新后调用。 | el, binding, vnode, oldVnode | unbind | 只调用一次,指令与元素解绑时调用。 | el, binding, vnode, oldVnode |
vue2.0钩子函数参数
钩子参数 | 作用 |
---|
el | 指令绑定到的元素。这可以用于直接操作 DOM。 | binding | 一个对象,包含以下属性。 | binding.name | 指令名,不包括 v- 前缀。 | binding.value | 传递给指令的值。例如在 v-my-directive=“1 + 1” 中,值是 2。 | binding.oldValue | 之前的值,仅在 beforeUpdate 和 updated 中可用。无论值是否更改,它都可用。 | binding.expression | 字符串形式的指令表达式。例如 v-my-directive=“1 + 1” 中,表达式为 “1 + 1”。 | binding.arg | :传递给指令的参数 (如果有的话)。例如在 v-my-directive:foo 中,参数是 “foo”。 | binding.modifiers | 一个包含修饰符的对象 (如果有的话)。例如在 v-my-directive.foo.bar 中,修饰符对象是 { foo: true, bar: true }。 | vnode | Vue 编译生成的虚拟节点 | oldVnode | 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。 |
|