iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Vue怎么自定义指令directive使用
  • 474
分享到

Vue怎么自定义指令directive使用

2023-07-06 03:07:16 474人浏览 独家记忆
摘要

本篇内容主要讲解“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://www.lsjlt.com/news/357540.html(转载时请注明来源链接)

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Vue怎么自定义指令directive使用
    本篇内容主要讲解“Vue怎么自定义指令directive使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue怎么自定义指令directive使用”吧!1. 一个指令定义对象可以提供如下几个钩...
    99+
    2023-07-06
  • vue自定义指令directive有什么用
    这篇文章主要介绍了vue自定义指令directive有什么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体内容如下所示: 官网...
    99+
    2022-10-19
  • vue-cli中怎么利用directive自定义指令
    这篇文章给大家介绍vue-cli中怎么利用directive自定义指令,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。template:<template> <div&...
    99+
    2022-10-19
  • vue自定义指令directive的使用场景
    目录1. 一个指令定义对象可以提供如下几个钩子函数(均为可选)2.指令钩子函数会被传入以下参数3.使用自定义指令场景的示例1. 一个指令定义对象可以提供如下几个钩子函数(均为可选) ...
    99+
    2023-05-16
    vue 自定义指令directive 自定义指令directive directive使用场景
  • 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的详细指南
    目录一、 什么是自定义指令二、 如何自定义指令钩子函数三、应用场景输入框防抖图片懒加载一键 Copy的功能拖拽总结一、 什么是自定义指令 我们看到的v-开头的行内属性,都是指令,不...
    99+
    2022-11-12
  • vue中自定义指令(directive)的基本使用方法
    目录前言正文1.全局注册2.局部注册3.钩子函数及参数设置4.灵活用法(1)动态指令参数(2)函数简写方式(3)对象字面量方式5.使用场景写在最后前言 在vue项目中我们经常使用到 ...
    99+
    2022-11-12
  • Vue.js directive自定义指令详解
    自定义一个demo指令 Vue自定义指令语法如下: Vue.directive(id, definition) 传入的两个参数,id是指指令ID,definition是指定义...
    99+
    2022-11-12
  • vue中自定义指令怎么用
    小编给大家分享一下vue中自定义指令怎么用,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!1、v-drag需求:鼠标拖动元素思路:元素偏移量 = 鼠标滑动后的坐标 - 鼠标初始点击元素时的坐标 + 初始点击时元素距离可视区域...
    99+
    2023-06-22
  • Vue自定义指令怎么写
    小编给大家分享一下Vue自定义指令怎么写,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!什么是Vue指令指令是一种可以附加到DOM...
    99+
    2022-10-19
  • vue全局自定义指令和局部自定义指令的使用
    目录局部自定义指令(只针对组件内的元素)定义全局自定义指令自定义指令的钩子函数自定义指令钩子函数的参数例子除了默认设置的核心指令 (v-model 和 v-show),Vue 也允许...
    99+
    2022-11-13
  • vue如何使用自定义指令
    这篇文章将为大家详细讲解有关vue如何使用自定义指令,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 使用自定义指令的逻辑与使用事件修饰符的逻辑...
    99+
    2022-10-19
  • Vue中如何使用自定义指令
    今天就跟大家聊聊有关Vue中如何使用自定义指令,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1.自定义指令的语法Vue自定义指令语法如下:Vue.d...
    99+
    2022-10-19
  • 详解Vue自定义指令及使用
    目录一、什么是指令vue 中常用的一些内置 v- 指令v-if 和 v-show 的对比二、自定义指令的钩子函数三、全局指令四、局部指令五、带参数的自定义指令六、函数简写七、应用实例...
    99+
    2022-11-12
  • Vue自定义指令及使用实例
    这篇文章主要介绍了Vue自定义指令及使用实例,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、什么是指令学习 vue 的时候肯定会接触指令,那么什么是指令呢?在 vue 中提...
    99+
    2023-06-15
  • Vue自定义指令详解
    目录Vue自定义指令自定义指令钩子函数输出相关属性运用例子总结Vue自定义指令 自定义指令 注册一个全局指令v-focus,该指令的功能是在页面加载时元素获得焦点 <!DO...
    99+
    2022-11-12
  • Vue自定义指令详细
    目录1、背景2、局部自定义指令3、全局自定义指令4.1 自定义指令钩子函数4.2 钩子函数参数4.3 动态指令传参 5、拓展1、背景 最近在面试找工作,然后面试官就问了有关自定义指令...
    99+
    2022-11-12
  • Vue中的自定义指令怎么实现
    今天小编给大家分享一下Vue中的自定义指令怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。试炼:实现v-mymodel...
    99+
    2023-07-04
  • 怎么完全掌握Vue自定义指令
    这篇文章主要介绍“怎么完全掌握Vue自定义指令”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么完全掌握Vue自定义指令”文章能帮助大家解决问题。准备:自定义指令介绍除了核心功能默认内置的指令 (v...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作