Vue——自定义指令

本文详细介绍了Vue.js中自定义指令的使用方法,包括全局指令与局部指令的区别、如何创建及使用自定义指令,以及钩子函数的应用场景。通过实例展示了如何通过自定义指令增强Vue组件的功能。

全局

/**
 * 全局指令 v-ff
 * Vue.directive('ff',{})
 * 指令使用比较频繁的情况下使用全局
 * 
 * 局部指令
 * 只使用一次 或少量次数的指令 使用局部
 */
 Vue.directive('ff', {
   // 当把指令与el绑定在一起的时候触发
   bind(el, binding, vnode) {
     // 当指令绑定到元素上时触发
      // 是获取到binding的值
      el.value = binding.value
      // 绑定的值在组件中的变量名称
      const name =  binding.expression
      // 给元素添加 原生事件获取到 元素的内容变化

      //  vnode.context 你的指令所在的组件
      el.addEventListener('input', function() {
        // 通过vnode的context修改组件中对应的变量
        vnode.context[name] = el.value
      })
   },
   inserted(el, binding) {
      // 表示该指令所在的元素已经插入到dom了
      // el.focus()
   },
   update(el, binding) {
    // 当指令绑定的组件内部数据发生改变时触发该钩子函数
    el.value = binding.value
   }
 })

局部

directives: { //directives 自定义指令
focus: { // v-focus
    bind(el, binding, vnode, oldVnode) {
        // v-focus绑定到元素或组件上时触发
        // console.log('bind')
        // html 原生元素对象
        // el.focus()
        // 在这里 指令所在的元素还没有被插入到dom所以 元素一些动态操作是不能实现的
        el.style.background = 'red';
        // console.log(binding)
    },
    inserted(el, binding, vnode, oldVnode) {
        // 当指令所在的元素插入到dom时 触发这个钩子
        // console.log('inserted')
        el.focus()
    },
    update(el, binding, vnode, oldVnode) {
        // console.log('update')
    }
},

批量导入

Vue.use((Vue) => {
  ((requireContext) => {
    const arr = requireContext.keys().map(requireContext);
    (arr || []).forEach((directive) => {
      directive = directive.__esModule && directive.default ? directive.default : directive;
      Object.keys(directive).forEach((key) => {
        Vue.directive(key, directive[key]);
      });
    });
  })(require.context('../directives', false, /^\.\/.*\.js$/));
});

钩子函数的参数 (即 elbindingvnodeoldVnode),除了 el 之外,其它参数都应该是只读的,切勿进行修改。如果需要在钩子之间共享数据,建议通过元素的 dataset 来进行

### 如何在 UniApp 和 Vue2 中创建和使用自定义指令 #### 在 Vue2 中创建全局自定义指令 为了在 Vue2 应用程序中创建并应用一个全局自定义指令,可以按照如下方式操作: ```javascript // main.js 文件中的配置 import Vue from 'vue'; import App from './App'; Vue.config.productionTip = false; // 定义全局指令 `v-focus`,用于让指定元素自动获得焦点 Vue.directive('focus', { inserted: function (el) { el.focus(); } }); /* eslint-disable no-new */ new Vue({ render: h => h(App), }).$mount('#app'); ``` 此代码片段展示了如何通过调用 `Vue.directive()` 方法注册名为 `v-focus` 的全局指令,在元素插入到 DOM 后立即执行其回调函数以设置该元素为聚焦状态[^4]。 #### 局部自定义指令的应用场景 如果只需要在一个特定组件内部使用某个自定义指令,则可以通过直接在其对应的 JavaScript 对象内声明来实现局部作用域内的自定义指令: ```html <template> <div class="example"> <!-- 使用了局部定义的 v-highlight 指令 --> <p v-highlight>这段文字将会被高亮显示。</p> </div> </template> <script> export default { name: 'ExampleComponent', directives: { highlight: { bind(el, binding, vnode) { // 设置背景颜色样式作为简单的例子 el.style.backgroundColor = '#FFFFCC'; }, }, }, }; </script> ``` 上述模板说明了一个叫作 `highlight` 的局部指令是如何工作的——它会在绑定阶段改变目标 `<p>` 元素的颜色属性[^5]。 #### 将这些概念应用于 UniApp 平台 UniApp 是基于 Vue 构建的一个跨平台开发框架,因此可以在其中同样遵循以上介绍的方式去编写自定义指令。对于希望在整个项目范围内生效的通用逻辑来说,应该优先考虑采用全局注册的形式;而对于仅限于单个页面或模块使用的特殊行为则更适合采取局部化处理策略。 考虑到不同端环境之间的差异性以及可能存在的兼容性问题,在实际编码过程中还需要注意测试各个平台上表现是否一致,并适当调整相关实现细节以确保最佳用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值