Vue3——自定义组件-插件
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)
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现