Vue3 自定义指令 插件
官网链接:https://cn.vuejs.org/guide/reusability/custom-directives.html#introduce
1.自定义指令:
1.1自定义指令声明
局部声明:
const focus = {
mounted: (el) => el.focus()
}
export default {
directives: {
// 在模板中启用 v-focus
focus
}
}
使用:
<template>
<div>
<input type="text" v-focus>
</div>
</template>
全局声明:
const app = createApp({})
// 使 v-focus 在所有组件中都可用
app.directive('demodir1', (el, binding) => {
console.log(binding.value.color); //获取指令中对象的字段的值
console.log(binding.value.text);
});
使用:
<template>
<div>
<div v-demodir1="{color:'white',text:'hello!'}"></div>
</div>
</template>
1.2自定义指令钩子
钩子函数
const myDirective = {
// 在绑定元素的 attribute 前
// 或事件监听器应用前调用
created(el, binding, vnode, prevVnode) {
// 下面会介绍各个参数的细节
},
// 在元素被插入到 DOM 前调用
beforeMount(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
:一个对象,包含以下属性。value
:传递给指令的值。例如在v-my-directive="1 + 1"
中,值是2
。oldValue
:之前的值,仅在beforeUpdate
和updated
中可用。无论值是否更改,它都可用。arg
:传递给指令的参数 (如果有的话)。例如在v-my-directive:foo
中,参数是"foo"
。modifiers
:一个包含修饰符的对象 (如果有的话)。例如在v-my-directive.foo.bar
中,修饰符对象是{ foo: true, bar: true }
。instance
:使用该指令的组件实例。dir
:指令的定义对象。
vnode
:代表绑定元素的底层 VNode。prevNode
:之前的渲染中代表指令所绑定元素的 VNode。仅在beforeUpdate
和updated
钩子中可用。
例子:
声明
const demodir={
mounted(el, binding, vnode, prevVnode) {
console.log(el);
console.log(binding.arg);
console.log(binding.modifiers);
console.log(binding.value);
console.log(binding.oldValue);
console.log(vnode);
console.log(prevVnode);
},
}
export default {
directives:{
demodir
}
}
调用
<template>
<div>
<h3 v-demodir:a.mdf="caicai">demodir</h3>
</div>
</template>
2.插件
官网地址:https://cn.vuejs.org/guide/reusability/plugins.html#introduction
2.1插件的安装、注册、使用
插件 (Plugins) 是一种能为 Vue 添加全局功能的工具代码
安装插件:
export default {
install: (app, options) => {
//写插件代码 // 配置此应用
app.config.globalProperties.$translate = (key) => {
};
}
}
插件注册:(app是vue的实例)
import pluginName from './plugins/pluginName';
const app=creatApp(App);
app.use(pluginName,{
// 配置此应用
})
插件调用:
<h1>{{ $translate('greetings.hello') }}</h1>
例子
//文件名 ii8n
export default {
install: (app, options) => {
//写插件代码
app.config.globalProperties.$translate = (key) => {
return key.split('.').reduce((o, i) => {
if (o) return o[i]
}, options)
};
// app.provide('i18n', options)
}
}
//插件注册
app.use(i18n, {
greetings: {
hello: '你好啊!!'
},
word1: "小爱同学"
})
<!--调用-->
<h3>{{$translate('word1')}}</h3>
2.2 插件中的 Provide / Inject
依赖注入,逐级透传
我们可以将插件接收到的 options
参数提供给整个应用,让任何组件都能使用这个对象。
export default {
install: (app, options) => {
//写插件代码
app.config.globalProperties.$translate = (key) => {
return key.split('.').reduce((o, i) => {
if (o) return o[i]
}, options)
};
app.provide('i18n', options)
}
}
export default {
inject: ['i18n'],
created() {
console.log(this.i18n.greetings.hello)
}
}
标签:el,插件,console,自定义,app,binding,vnode,Vue3
From: https://www.cnblogs.com/caiiac/p/16839847.html