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:之前的值,仅在 beforeUpdateupdated 中可用。无论值是否更改,它都可用。
    • arg:传递给指令的参数 (如果有的话)。例如在 v-my-directive:foo 中,参数是 "foo"
    • modifiers:一个包含修饰符的对象 (如果有的话)。例如在 v-my-directive.foo.bar 中,修饰符对象是 { foo: true, bar: true }
    • instance:使用该指令的组件实例。
    • dir:指令的定义对象。
  • vnode:代表绑定元素的底层 VNode。
  • prevNode:之前的渲染中代表指令所绑定元素的 VNode。仅在 beforeUpdateupdated 钩子中可用。

例子

声明

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)
  }
}
posted @   菜彩  阅读(1595)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示