返回顶部
首页 > 资讯 > 精选 >vue自定义指令directive使用的方法是什么
  • 934
分享到

vue自定义指令directive使用的方法是什么

2023-07-06 04:07:02 934人浏览 薄情痞子
摘要

本篇内容主要讲解“Vue自定义指令directive使用的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vue自定义指令directive使用的方法是什么”吧!1. 一个指令定义对象可

本篇内容主要讲解“Vue自定义指令directive使用的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vue自定义指令directive使用的方法是什么”吧!

1. 一个指令定义对象可以提供如下几个钩子函数(均为可选)

  • bind:只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。

  • inserted:被绑定元素插入父节点时调用(仅保证父节点存在,但不一定已被插入文档中)。

  • update:只要当前元素不被移除,其他操作几乎都会触发这2个生命周期,先触发update后触发componentUpdate。虚拟DOM什么时候更新:只要涉及到元素的隐藏、显示(display)值的改变、内容的改变等都会触发虚拟DOM更新.

  • componentUpdated:组件更新

  • unbind:当使用指令的元素被卸载的时候会执行,就是当前元素被移除的时候,只调用一次

Vue.directive 内置了五个钩子函数 :

bind(绑定触发)、inserted(插入触发)、update(更新触发)、componentUpdated(组件更新触发)和unbind(解绑触发)函

 // 注册    Vue.directive('my-directive',{        bind:  function () {},                 inserted: function () {},        update: function () {},        componentUpdated: function () {},        unbind: function() {}    })

2.指令钩子函数会被传入以下参数

  • el:指定所绑定的元素,可以用来直接操作DOM

  • binding:一个对象,包含以下属性:

    • name:指令名,不包含前缀v-

    • value:指令的绑定值,例如:v-my-directive="1+1"中,绑定值为2

    • oldValue:指令绑定的前一个值,仅在update和componentUpdated钩子中可用,无论值是否改变都可用。

    • expression: 绑定值的字符串形式。 例如 v-my-directive=“1 + 1” , expression 的值是 “1 + 1”。

    • arg: 传给指令的参数。例如 v-my-directive:foo, arg 的值是 “foo”。

    • modifiers: 一个包含修饰符的对象。 例如: v-my-directive.foo.bar, 修饰符对象 modifiers 的值是{ foo: true, bar: true }。

    • vnode: Vue 编译生成的虚拟节点

    • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用

  • vnode:vue编译生成的虚拟节点

  • oldVnode:上一个虚拟节点,仅在update和componentUpdated钩子中可用

除了el之外,其他参数都应该是只读的,不能修改。如果需要在钩子之间共享数据,建议通过元素的 dataset 来进行。

3.使用自定义指令场景的示例

drag.js

import Vue from 'vue'import { Message } from 'element-ui';// 自定义指令示例1:弹窗拖拽Vue.directive('dialogDrag',{    bind(el,binding,vnode,oldVnode){        const dialogHeader = el.querySelector('.el-dialog__header');        const dialogDom = el.querySelector('.el-dialog');        dialogHeader.style.cursor = 'move'                const sty = dialogDom.currentStyle || window.getComputedStyle(dialogDom, null)        dialogHeader.onmousedown = (e) => {            //按下鼠标,获取点击的位置 距离 弹窗的左边和上边的距离            //点击的点距离左边窗口的距离 - 弹窗距离左边窗口的距离            const distX = e.clientX - dialogHeader.offsetLeft;            const distY = e.clientY - dialogHeader.offsetTop;            //弹窗的left属性值和top属性值            let styL, styT            //注意在ie中,第一次获取到的值为组件自带50%,移动之后赋值为Px            if(sty.left.includes('%')){                styL = +document.body.clientWidth * (+sty.left.replace(/%/g,'') / 100)                styT = +document,body.clientHeight * (+sty.top.replace(/%/g,'') / 100)            }else{                styL = +sty.left.replace(/px/g,'');                styT = +sty.top.replace(/px/g,'');            }            document.onmousemove = function(e) {                //通过事件委托,计算移动距离                const l = e.clientX - distX                const t = e.clientY - distY                //移动当前的元素                dialogDom.style.left = `${l + styL}px`                dialogDom.style.top = `${t + styT}px`            }            document.onmouseup = function(e){                document.onmousemove = null                document.onmouseup = null            }        }    }})//自定义指令示例2:v-dialogDragWidth 可拖动弹窗宽度(右侧边)Vue.directive('dragWidth',{  bind(el) {      const dragDom = el.querySelector('.el-dialog');      const lineEl = document.createElement('div');      lineEl.style = 'width: 5px; background: inherit; height: 80%; position: absolute; right: 0; top: 0; bottom: 0; margin: auto; z-index: 1; cursor: w-resize;';      lineEl.addEventListener('mousedown',          function (e) {              // 鼠标按下,计算当前元素距离可视区的距离              const disX = e.clientX - el.offsetLeft;              // 当前宽度              const curWidth = dragDom.offsetWidth;              document.onmousemove = function (e) {                  e.preventDefault(); // 移动时禁用默认事件                  // 通过事件委托,计算移动的距离                  const l = e.clientX - disX;                  if(l > 0){                      dragDom.style.width = `${curWidth + l}px`;                  }              };              document.onmouseup = function (e) {                  document.onmousemove = null;                  document.onmouseup = null;              };          }, false);      dragDom.appendChild(lineEl);  }})// 自定义指令示例3:v-dialogDragWidth 可拖动弹窗高度(右下角)Vue.directive('dragHeight',{  bind(el) {      const dragDom = el.querySelector('.el-dialog');      const lineEl = document.createElement('div');      lineEl.style = 'width: 6px; background: inherit; height: 10px; position: absolute; right: 0; bottom: 0; margin: auto; z-index: 1; cursor: nwse-resize;';      lineEl.addEventListener('mousedown',          function(e) {              // 鼠标按下,计算当前元素距离可视区的距离              const disX = e.clientX - el.offsetLeft;              const disY = e.clientY - el.offsetTop;              // 当前宽度 高度              const curWidth = dragDom.offsetWidth;              const curHeight = dragDom.offsetHeight;              document.onmousemove = function(e) {                  e.preventDefault(); // 移动时禁用默认事件                  // 通过事件委托,计算移动的距离                  const xl = e.clientX - disX;                  const yl = e.clientY - disY                  dragDom.style.width = `${curWidth + xl}px`;                  dragDom.style.height = `${curHeight + yl}px`;              };              document.onmouseup = function(e) {                  document.onmousemove = null;                  document.onmouseup = null;              };          }, false);      dragDom.appendChild(lineEl);  }})// 自定义指令示例4:图片加载前填充背景色Vue.directive('imgUrl',function(el,binding){    var color=Math.floor(Math.random()*1000000);//设置随机颜色    el.style.backgroundColor='#'+color;       var img=new Image();    img.src=binding.value;// -->binding.value指的是指令后的参数    img.onload=function(){      el.style.backgroundColor='';      el.src=binding.value;          }  })// 自定义指令示例5:输入框聚焦Vue.directive("focus", {    // 当被绑定的元素插入到 DOM 中时……    inserted (el) {        // 聚焦元素        el.querySelector('input').focus()    },  });// 自定义指令示例6:设置防抖自定义指令Vue.directive('throttle', {    bind: (el, binding) => {      let setTime = binding.value; // 可设置防抖时间      if (!setTime) { // 用户若不设置防抖时间,则默认2s        setTime = 1000;      }      let cbFun;      el.addEventListener('click', event => {        if (!cbFun) { // 第一次执行          cbFun = setTimeout(() => {            cbFun = null;          }, setTime);        } else {                      event && event.stopImmediatePropagation();        }      }, true);    },  });// 自定义指令示例7:点击按钮操作频繁给出提示  Vue.directive('preventReClick', {    inserted: function (el, binding) {      el.addEventListener('click', () => {        if (!el.disabled) {          el.disabled = true          Message.warning('操作频繁')          setTimeout(() => {            el.disabled = false            //可设置时间          }, binding.value || 3000)        }      })    }})

main.js中引入文件:

import '@/assets/js/drag.js'

页面使用:

<template>  <div>    <el-button type="text" @click="dialogVisible = true">点击打开 Dialog</el-button>    <div >      <img v-imgUrl="url"></img>       <img v-imgUrl="url"></img>       <img v-imgUrl="url"></img>       <img v-imgUrl="url"></img>       <img v-imgUrl="url"></img>       <img v-imgUrl="url"></img>       <img v-imgUrl="url"></img>       <img v-imgUrl="url"></img>     </div>    <div>      <el-input  placeholder="请选择日期" suffix-icon="el-icon-date"  v-model="input1"></el-input>      <el-input v-focus placeholder="请输入内容" prefix-icon="el-icon-search" v-model="input2"></el-input>    </div>    <div>      <el-button type="danger" v-throttle @click="throttleBtn">危险按钮</el-button>      <el-button @click="submitFORM()">创建</el-button>    </div>    <el-dialog title="提示" v-dialogDrag v-dragWidth v-dragHeight :visible.sync="dialogVisible" width="30%" :before-close="handleClose">      <span>这是一段信息</span>      <span slot="footer" class="dialog-footer">        <el-button @click="dialogVisible = false">取 消</el-button>        <el-button type="primary" @click="dialogVisible = false">确 定</el-button>      </span>    </el-dialog>  </div></template><script>export default {  data() {    return {      dialogVisible: false,      url:'//www.baidu.com/img/flexible/loGo/pc/result.png',      input1: '',      input2: '',    }  },  methods: {    handleClose(done) {      console.log('弹窗打开')      },    throttleBtn(){      console.log('我的用来测试防抖的按钮')    },    submitForm(){      this.$message.error('Message 消息提示每次只能1个');    }  },}</script><style>img{  width: 100px;  height: 100px;}</style>

到此,相信大家对“vue自定义指令directive使用的方法是什么”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: vue自定义指令directive使用的方法是什么

本文链接: https://lsjlt.com/news/357655.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • vue自定义指令directive使用的方法是什么
    本篇内容主要讲解“vue自定义指令directive使用的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vue自定义指令directive使用的方法是什么”吧!1. 一个指令定义对象可...
    99+
    2023-07-06
  • Vue自定义指令directive的使用方法分享
    1. 一个指令定义对象可以提供如下几个钩子函数(均为可选) bind:只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。 inserted:被绑定元素插入父节...
    99+
    2023-05-15
    Vue自定义指令directive使用 Vue自定义指令directive Vue directive
  • vue自定义指令directive有什么用
    这篇文章主要介绍了vue自定义指令directive有什么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体内容如下所示: 官网...
    99+
    2024-04-02
  • Vue怎么自定义指令directive使用
    本篇内容主要讲解“Vue怎么自定义指令directive使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue怎么自定义指令directive使用”吧!1. 一个指令定义对象可以提供如下几个钩...
    99+
    2023-07-06
  • vue中自定义指令(directive)的基本使用方法
    目录前言正文1.全局注册2.局部注册3.钩子函数及参数设置4.灵活用法(1)动态指令参数(2)函数简写方式(3)对象字面量方式5.使用场景写在最后前言 在vue项目中我们经常使用到 ...
    99+
    2024-04-02
  • vue自定义指令directive的使用场景
    目录1. 一个指令定义对象可以提供如下几个钩子函数(均为可选)2.指令钩子函数会被传入以下参数3.使用自定义指令场景的示例1. 一个指令定义对象可以提供如下几个钩子函数(均为可选) ...
    99+
    2023-05-16
    vue 自定义指令directive 自定义指令directive directive使用场景
  • vue自定义指令使用的方法是什么
    这篇“vue自定义指令使用的方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vue自定义指令使用的方法是什么”文章吧...
    99+
    2023-07-05
  • vue-cli中怎么利用directive自定义指令
    这篇文章给大家介绍vue-cli中怎么利用directive自定义指令,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。template:<template> <div&...
    99+
    2024-04-02
  • vue中自定义指令directive的详细指南
    目录一、 什么是自定义指令二、 如何自定义指令钩子函数三、应用场景输入框防抖图片懒加载一键 Copy的功能拖拽总结一、 什么是自定义指令 我们看到的v-开头的行内属性,都是指令,不...
    99+
    2024-04-02
  • vue3自定义指令的方法是什么
    这篇文章主要介绍“vue3自定义指令的方法是什么”,在日常操作中,相信很多人在vue3自定义指令的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vue3自定义指令的方法是什么”的疑惑有所帮助!接下来...
    99+
    2023-07-04
  • vue3自定义指令方法是什么
    这篇文章主要讲解了“vue3自定义指令方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue3自定义指令方法是什么”吧!一、注册自定义指令以下实例都是实现一个输入框自动获取焦点的自定...
    99+
    2023-06-21
  • vue自定义指令传参方式是什么
    这篇文章主要介绍“vue自定义指令传参方式是什么”,在日常操作中,相信很多人在vue自定义指令传参方式是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vue自定义指令传参方式是什么”的疑惑有所帮助!接下来...
    99+
    2023-06-30
  • vue全局自定义指令和局部自定义指令的使用
    目录局部自定义指令(只针对组件内的元素)定义全局自定义指令自定义指令的钩子函数自定义指令钩子函数的参数例子除了默认设置的核心指令 (v-model 和 v-show),Vue 也允许...
    99+
    2024-04-02
  • vue自定义指令的方法有哪些
    在vue中自定义指令的方法有:语法:Vue.directive(id, definition);1.自定义全局指令;2.自定义私有指令;在vue中自定义指令的方法有以下两种vue自定义指令语法:Vue.directive(id, ...
    99+
    2024-04-02
  • vue自定义封装指令及实际使用的方法
    本篇内容主要讲解“vue自定义封装指令及实际使用的方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vue自定义封装指令及实际使用的方法”吧!前言vue默认内置了v-model、v-if、v-s...
    99+
    2023-06-29
  • vue如何使用自定义指令
    这篇文章将为大家详细讲解有关vue如何使用自定义指令,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 使用自定义指令的逻辑与使用事件修饰符的逻辑...
    99+
    2024-04-02
  • Vue 3.0自定义指令的使用入门
    目录一、自定义指令1、注册全局自定义指令2、使用全局自定义指令3、完整的使用示例二、注册全局自定义指令的过程三、应用挂载的过程四、阿宝哥有话说4.1 Vue 3 有哪些内置指令?4....
    99+
    2024-04-02
  • vue中的自定义指令如何使用
    这篇文章主要介绍“vue中的自定义指令如何使用”,在日常操作中,相信很多人在vue中的自定义指令如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vue中的自定义指令如何使用”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-29
  • 浅析vue中的自定义指令使用
    Vue3版本:有稍微变化,由于本文主要说的都是 Vue2 版本的(也是手上很多 vue2 版本的老项目在维护),Vue3的就不做详细介绍了,感兴趣可查看: cn.vuejs.org/guide/reusa…实战以下都是我在项目中用到的自定义...
    99+
    2023-05-14
    Vue 指令 自定义指令
  • 详解Vue自定义指令及使用
    目录一、什么是指令vue 中常用的一些内置 v- 指令v-if 和 v-show 的对比二、自定义指令的钩子函数三、全局指令四、局部指令五、带参数的自定义指令六、函数简写七、应用实例...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作