亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

vue自定義指令合集(超實用!)

 更新時間:2024年03月15日 10:19:54   作者:思考的行者  
Vue自定義指令是Vue中一種非常有用的擴展能力,它允許你在標準的模板語法中使用自定義行為,而不需要編寫新的組件或者混入,這篇文章主要給大家介紹了關(guān)于vue自定義指令的相關(guān)資料,需要的朋友可以參考下

一、什么是自定義指令

vue官方提供很多指令,如:v-model,v-show,v-if,v-if等,他們都以v-開頭。當這些指令不能滿足我們實際開發(fā)需求時,我們還可以自定義指令。自定義指令主要分為全局自定義指令和局部自定義指令。

二、全局自定義指令directive

在main.js中寫全局自定義指令

// 自動獲取焦點
Vue.directive('focus', {
  inserted: function (el) {
    el.focus()
  }
})

三、局部自定義指令directives

可以在任意組件中定義自定義指令,directives是一個對象,他的每一個屬性就只一個自定義指令,這里定義了一個focus指令。

directives: {
  focus: {
    inserted: function (el) {
      el.focus()
    }
  }
}

四、自定義指令的調(diào)用

和普通指令的使用方式一樣v-自定義指令名稱

如v-focus

五、自定義指令的鉤子函數(shù)

有以下五個鉤子函數(shù):

  • bind:只調(diào)用一次,指令第一次綁定到元素時調(diào)用。在這里可以進行一次性的初始化設(shè)置。

  • inserted:被綁定元素插入父節(jié)點時調(diào)用 (僅保證父節(jié)點存在,但不一定已被插入文檔中)。

  • update:所在組件的 VNode 更新時調(diào)用,但是可能發(fā)生在其子 VNode 更新之前。指令的值可能發(fā)生了改變,也可能沒有。但是你可以通過比較更新前后的值來忽略不必要的模板更新。

  • componentUpdated:指令所在組件的 VNode 及其子 VNode 全部更新后調(diào)用。

  • unbind:只調(diào)用一次,指令與元素解綁時調(diào)用。

每個鉤子函數(shù)有以下參數(shù):

  • el:指令所綁定的元素,可以用來直接操作 DOM。
  • binding:一個對象,包含以下 property:
    • name:指令名,不包括 v- 前綴。
    • value:指令的綁定值,例如:v-my-directive="1 + 1" 中,綁定值為 2。
    • oldValue:指令綁定的前一個值,僅在 update 和 componentUpdated 鉤子中可用。無論值是否改變都可用。
    • expression:字符串形式的指令表達式。例如 v-my-directive="1 + 1" 中,表達式為 "1 + 1"。
    • arg:傳給指令的參數(shù),可選。例如 v-my-directive:foo 中,參數(shù)為 "foo"。
    • modifiers:一個包含修飾符的對象。例如:v-my-directive.foo.bar 中,修飾符對象為 { foo: true, bar: true }。
  • vnode:Vue 編譯生成的虛擬節(jié)點。
  • oldVnode:上一個虛擬節(jié)點,僅在 update 和 componentUpdated 鉤子中可用。

注意:bind和insert都只調(diào)用一次;bind在insert前執(zhí)行,也就是bind在dom樹繪制前調(diào)用,insert在dom樹繪制后調(diào)用;涉及dom操作的,我們一般都用insert,如自動獲取焦點指令,只能用insert函數(shù)。

六、自定義指令傳參

<div v-test:[data1]>這是測試頁。。。。</div>

可以用binding.arg去接收":"后的參加參數(shù),這里傳遞了data1這個變量,data1必須用[]包裹,否則就是‘data1’這個字符串,[]中只能傳遞一個變量,多個變量可以用對象或數(shù)組組裝。binding.value去接收"="后的參數(shù),這里是個函數(shù)所以用bingding.value()去調(diào)用。

        <div v-test:[data1]='func'>這是測試頁。。。。</div>

        test: {
			inserted(el, binding, vnode) {
				// 獲取參數(shù)
				console.log('test',binding.arg);
				// 執(zhí)行傳遞的函數(shù)
				binding.value({success: true,data:{}});
			},
		}

七、常見自定義指令

  1、拖拽

        dragV: {
			bind(drag, binding, vNode) {
				drag.style.position = 'absolute';
				drag.style.zIndex = '9999';
				//當鼠標按下時
				drag.onmousedown = e => {
					//做到瀏覽器兼容
					e = e || window.event  
					let diffX = e.clientX - drag.offsetLeft
					let diffY = e.clientY - drag.offsetTop
					//當拉著box移動時
					document.onmousemove = e => {
						// 瀏覽器兼容
						e = e || window.event;
						let left = e.clientX - diffX;
						let top = e.clientY - diffY;
						drag.style.left = left + 'px';
						drag.style.top = top + 'px';
					}
					// 當鼠標抬起時
					document.onmouseup = function() {
						this.onmousemove = null
						this.onmouseup = null
					}
				}
			}
		},

2、防抖

        <div v-debounce:[time]="debounceFunc">這是測試頁。。。。</div>

        debounce:{
			inserted(el, binding) {
				let timer;
				let delay = binding.arg || 500;
				el.addEventListener('click', () => {
					if (timer) {
						clearTimeout(timer)
					}
					timer = setTimeout(() => {
						binding.value()
					}, delay)
				})
			},
		}

八. 應(yīng)用場景

8.1 自動獲取焦點(官方示例)

// 注冊一個全局自定義指令 `v-focus`
Vue.directive('focus', {
  // 當被綁定的元素插入到 DOM 中時……
  inserted: function (el) {
    // 聚焦元素
    el.focus()
  }
})

8.2 一鍵 Copy的功能

  • 首先建一個 js 文件(v-copy.js)。定義一個對象。( 指令實際就是一個對象 )
import { Message } from 'ant-design-vue';

const vCopy = { // 名字愛取啥取啥
  /*
    bind 鉤子函數(shù),第一次綁定時調(diào)用,可以在這里做初始化設(shè)置
    el: 作用的 dom 對象
    value: 傳給指令的值,也就是我們要 copy 的值
  */
  bind(el, { value }) {
    el.$value = value; // 用一個全局屬性來存?zhèn)鬟M來的值,因為這個值在別的鉤子函數(shù)里還會用到
    el.handler = () => {
      if (!el.$value) {
      // 值為空的時候,給出提示,我這里的提示是用的 ant-design-vue 的提示,你們隨意
        Message.warning('無復制內(nèi)容');
        return;
      }
      // 動態(tài)創(chuàng)建 textarea 標簽
      const textarea = document.createElement('textarea');
      // 將該 textarea 設(shè)為 readonly 防止 iOS 下自動喚起鍵盤,同時將 textarea 移出可視區(qū)域
      textarea.readOnly = 'readonly';
      textarea.style.position = 'absolute';
      textarea.style.left = '-9999px';
      // 將要 copy 的值賦給 textarea 標簽的 value 屬性
      textarea.value = el.$value;
      // 將 textarea 插入到 body 中
      document.body.appendChild(textarea);
      // 選中值并復制
      textarea.select();
      // textarea.setSelectionRange(0, textarea.value.length);
      const result = document.execCommand('Copy');
      if (result) {
        Message.success('復制成功');
      }
      document.body.removeChild(textarea);
    };
    // 綁定點擊事件,就是所謂的一鍵 copy 啦
    el.addEventListener('click', el.handler);
  },
  // 當傳進來的值更新的時候觸發(fā)
  componentUpdated(el, { value }) {
    el.$value = value;
  },
  // 指令與元素解綁的時候,移除事件綁定
  unbind(el) {
    el.removeEventListener('click', el.handler);
  },
};

export default vCopy;

總結(jié) 

到此這篇關(guān)于vue自定義指令的文章就介紹到這了,更多相關(guān)vue自定義指令內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解vue element plus多語言切換

    詳解vue element plus多語言切換

    這篇文章主要為大家介紹了vue element plus多語言切換,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • Vxe-Table開發(fā)中的各種坑以及避坑指南

    Vxe-Table開發(fā)中的各種坑以及避坑指南

    vxe-table是一個全功能的Vue表格,滿足絕大部分對Table的一切需求,與任意組件庫完美兼容,下面這篇文章主要給大家介紹了關(guān)于Vxe-Table開發(fā)中各種坑以及避坑的相關(guān)資料,需要的朋友可以參考下
    2022-09-09
  • 解決微信瀏覽器緩存站點入口文件(IIS部署Vue項目)

    解決微信瀏覽器緩存站點入口文件(IIS部署Vue項目)

    這篇文章主要介紹了解決微信瀏覽器緩存站點入口文件(IIS部署Vue項目),本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-06-06
  • 前端vue3樹形組件使用代碼示例

    前端vue3樹形組件使用代碼示例

    最近在開發(fā)時遇到一個問題,是在輸入框里面放一個樹形組件,這篇文章主要給大家介紹了關(guān)于前端vue3樹形組件使用的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-07-07
  • Vue-cli 使用json server在本地模擬請求數(shù)據(jù)的示例代碼

    Vue-cli 使用json server在本地模擬請求數(shù)據(jù)的示例代碼

    本篇文章主要介紹了Vue-cli 使用json server在本地模擬請求數(shù)據(jù)的示例代碼,非常具有實用價值,需要的朋友可以參考下
    2017-11-11
  • vue實現(xiàn)前端按鈕組件權(quán)限管理

    vue實現(xiàn)前端按鈕組件權(quán)限管理

    這篇文章主要為大家介紹了vue實現(xiàn)前端按鈕組件權(quán)限管理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • Vue實現(xiàn)拖放排序功能的實例代碼

    Vue實現(xiàn)拖放排序功能的實例代碼

    本文通過實例代碼給大家介紹了Vue中實現(xiàn)拖放排序功能,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-07-07
  • 詳解Vue使用命令行搭建單頁面應(yīng)用

    詳解Vue使用命令行搭建單頁面應(yīng)用

    本篇文章主要介紹了詳解Vue使用命令行搭建單頁面應(yīng)用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • 從vue源碼看props的用法

    從vue源碼看props的用法

    平時寫vue的時候知道 props 有很多種用法,今天我們來看看vue內(nèi)部是怎么處理 props 中那么多的用法的。非常具有實用價值,需要的朋友可以參考下
    2019-01-01
  • 詳解Vue-Router的安裝與使用

    詳解Vue-Router的安裝與使用

    Vue Router 是 Vue.js 官方的路由管理器。它和 Vue.js 的核心深度集成,讓構(gòu)建單頁面應(yīng)用變得易如反掌。本文介紹下Vue Router的安裝與使用
    2021-06-06

最新評論