這篇文章主要為大家展示了“Vuejs中常用的自定義指令有哪些”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“Vuejs中常用的自定義指令有哪些”這篇文章吧。
圍場網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設計、網(wǎng)站建設、微信開發(fā)、APP開發(fā)、響應式網(wǎng)站建設等網(wǎng)站項目制作,到程序開發(fā),運營維護。創(chuàng)新互聯(lián)從2013年成立到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設就選創(chuàng)新互聯(lián)。
在Vuejs中,自定義一些指令對底層DOM進行操作。
1、元素點擊范圍擴展指令 v-expandClick
使用該指令可以隱式的擴展元素的點擊范圍,由于借用偽元素實現(xiàn),故不會影響元素在頁面上的排列布局。
可傳入的參數(shù)為:上右下左擴展的范圍,單位 px,默認向外擴展 10px。指令的代碼如下:
export default function (el, binding) { const s = document.styleSheets[document.styleSheets.length - 1] const DEFAULT = -10 // 默認向外擴展10px const ruleStr = `content:"";position:absolute;top:-${top || DEFAULT}px;bottom:-${bottom || DEFAULT}px;right:-${right || DEFAULT}px;left:-${left || DEFAULT}px;` const [top, right, bottom, left] = binding.expression && binding.expression.split(',') || [] const classNameList = el.className.split(' ') el.className = classNameList.includes('expand_click_range') ? classNameList.join(' ') : [...classNameList, 'expand_click_range'].join(' ') el.style.position = el.style.position || "relative" if (s.insertRule) { s.insertRule('.expand_click_range::before' + '{' + ruleStr + '}', s.cssRules.length) } else { /* IE */ s.addRule('.expand_click_range::before', ruleStr, -1) } }
參數(shù) Attributes:
然后你可以在模板中任何元素上使用新的 v-expandClick property,如下:
<div v-expandClick="20,30,40,50" @click="glabClickoutside"> 點擊范圍擴大</div>
2、文本內(nèi)容復制指令 v-copy
使用該指令可以復制元素的文本內(nèi)容(指令支持單擊復制 v-copy、雙擊復制 v-copy.dblclick、點擊icon復制 v-copy.icon 三種模式),不傳參數(shù)時,默認使用單擊復制。
指令的代碼如下:
export default { bind (el, binding) { // 雙擊觸發(fā)復制 if (binding.modifiers.dblclick) { el.addEventListener('dblclick', () => handleClick(el.innerText)) el.style.cursor = 'copy' } // 點擊icon觸發(fā)復制 else if (binding.modifiers.icon) { if (el.hasIcon) return const iconElement = document.createElement('i') iconElement.setAttribute('class', 'el-icon-document-copy') iconElement.setAttribute('style', 'margin-left:5px') el.appendChild(iconElement) el.hasIcon = true iconElement.addEventListener('click', () => handleClick(el.innerText)) iconElement.style.cursor = 'copy' } // 單擊觸發(fā)復制 else { el.addEventListener('click', () => handleClick(el.innerText)) el.style.cursor = 'copy' } } } function handleClick (text) { // 創(chuàng)建元素 if (!document.getElementById('copyTarget')) { const copyTarget = document.createElement('input') copyTarget.setAttribute('style', 'position:fixed;top:0;left:0;opacity:0;z-index:-1000;') copyTarget.setAttribute('id', 'copyTarget') document.body.appendChild(copyTarget) } // 復制內(nèi)容 const input = document.getElementById('copyTarget') input.value = text input.select() document.execCommand('copy') // alert('復制成功') }
參數(shù) Attributes:
然后你可以在模板中任何元素上使用新的 v-copy property,如下:
<div v-copy> 單擊復制 </div> <div v-copy.dblclick> 雙擊復制 </div> <div v-copy.icon> icon復制 </div>
3、元素全屏指令 v-screenfull
全屏指令,點擊元素進行全屏/退出全屏的操作。支持元素后面是否插入 element-ui 的全屏圖標 el-icon-full-screen。
指令的代碼如下:
import screenfull from 'screenfull' export default { bind (el, binding) { if (binding.modifiers.icon) { if (el.hasIcon) return // 創(chuàng)建全屏圖標 const iconElement = document.createElement('i') iconElement.setAttribute('class', 'el-icon-full-screen') iconElement.setAttribute('style', 'margin-left:5px') el.appendChild(iconElement) el.hasIcon = true } el.style.cursor = el.style.cursor || 'pointer' // 監(jiān)聽點擊全屏事件 el.addEventListener('click', () => handleClick()) } } function handleClick () { if (!screenfull.isEnabled) { alert('瀏覽器不支持全屏') return } screenfull.toggle() }
參數(shù) Attributes:
然后你可以在模板中任何元素上使用新的 v-screenfull property,如下:
<div v-screenfull.icon> 全屏 </div>
4、元素說明指令 v-tooltip
為元素添加說明,如同 element-ui 的 el-tooltip(問號 icon 在鼠標覆蓋后,展示說明文字)。
指令的代碼如下:
import Vue from 'vue' export default function (el, binding) { if (el.hasIcon) return const iconElement = structureIcon(binding.arg, binding.value) el.appendChild(iconElement) el.hasIcon = true } function structureIcon (content, attrs) { // 拼接綁定屬性 let attrStr = '' for (let key in attrs) { attrStr += `${key}=${attrs[key]} ` } const a = `<el-tooltip content=${content} ${attrStr}><i class="el-icon-question" style="margin:0 10px"></i></el-tooltip>` // 創(chuàng)建構造器 const tooltip = Vue.extend({ template: a }) // 創(chuàng)建一個 tooltip 實例并返回 dom 節(jié)點 const component = new tooltip().$mount() return component.$el }
參數(shù) Attributes:
然后你可以在模板中任何元素上使用新的 v-tooltip property,如下:
<div v-tooltip:content='tootipParams'> 提示 </div>
舉例:
<div v-tooltip:提示內(nèi)容為XXX1> 提示1</div> <div v-tooltip:提示內(nèi)容為XXX='tootipParams'> 提示2 </div>
為指令傳入 element-ui 支持的參數(shù):
data() { return { tootipParams: { placement: 'top', effect: 'light', } } }
5、文字超出省略指令 v-ellipsis
使用該指令當文字內(nèi)容超出寬度(默認 100 px)時自動變?yōu)槭÷孕问?。等同于使?css:
width: 100px; whiteSpace: nowrap overflow: hidden; textOverflow: ellipsis;
使用指令效果:
指令的代碼如下:
export default function (el, binding) { el.style.width = binding.arg || 100 + 'px' el.style.whiteSpace = 'nowrap' el.style.overflow = 'hidden'; el.style.textOverflow = 'ellipsis'; }
參數(shù) Attributes:
然后你可以在模板中任何元素上使用新的 v-ellipsis property,如下:
<div v-ellipsis:100> 需要省略的文字是阿薩的副本阿薩的副本阿薩的副本阿薩的副本</div>
6、回到頂部指令 v-backtop
使用該指令可以讓頁面或指定元素回到頂部。
可選指定元素,如果不指定則全局頁面回到頂部??蛇x在元素偏移多少 px 后顯示 backtop 元素,例如在滾動 400px 后顯示回到頂部按鈕。
指令的代碼如下:
export default { bind (el, binding, vnode) { // 響應點擊后滾動到元素頂部 el.addEventListener('click', () => { const target = binding.arg ? document.getElementById(binding.arg) : window target.scrollTo({ top: 0, behavior: 'smooth' }) }) }, update (el, binding, vnode) { // 滾動到達參數(shù)值才出現(xiàn)綁定指令的元素 const target = binding.arg ? document.getElementById(binding.arg) : window if (binding.value) { target.addEventListener('scroll', (e) => { if (e.srcElement.scrollTop > binding.value) { el.style.visibility = 'unset' } else { el.style.visibility = 'hidden' } }) } // 判斷初始化狀態(tài) if (target.scrollTop < binding.value) { el.style.visibility = 'hidden' } }, unbind (el) { const target = binding.arg ? document.getElementById(binding.arg) : window target.removeEventListener('scroll') el.removeEventListener('click') } }
參數(shù) Attributes:
然后你可以在模板中任何元素上使用新的 v-backtop property,如下表示在 id 為 app 的元素滾動 400px 后顯示綁定指令的元素:
<div v-backtop:app="400"> 回到頂部 </div>
也可以這樣使用,表示為一直顯示綁定指令的元素,并且是全局頁面回到頂部:
<div v-backtop> 回到頂部 </div>
7、空狀態(tài)指令 v-empty
使用該指令可以顯示缺省的空狀態(tài)??梢詡魅肽J圖片(可選,默認無圖片)、默認文字內(nèi)容(可選,默認為暫無數(shù)據(jù))、以及標示是否顯示空狀態(tài)(必選)。
指令的代碼如下:
import Vue from "vue"; export default { update (el, binding, vnode) { el.style.position = el.style.position || 'relative' const { offsetHeight, offsetWidth } = el const { visible, content, img } = binding.value const image = img ? `<img src="${img}" height="30%" width="30%"></img>` : '' const defaultStyle = "position:absolute;top:0;left:0;z-index:9999;background:#fff;display:flex;justify-content: center;align-items: center;" const empty = Vue.extend({ template: `<div style="height:${offsetHeight}px;width:${offsetWidth}px;${defaultStyle}"> <div style="text-align:center"> <div>${image}</div> <div>${content || '暫無數(shù)據(jù)'}</div> </div> </div>` }) const component = new empty().$mount().$el if (visible) { el.appendChild(component) } else { el.removeChild(el.lastChild) } }, }
參數(shù) Attributes:
然后你可以在模板中任何元素上使用新的 v-empty property,如下傳入對象 emptyValue:
<div style="height:500px;width:500px" v-empty="emptyValue"> 原本內(nèi)容
需要傳入一個參數(shù)對象,例如顯示文字為:暫無列表,圖片路徑為 ../../assets/images/blue_big.png,控制標示 visible:
emptyValue = { content: '暫無列表', img: require('../../assets/images/blue_big.png'), visible: true, },
8、徽標指令 v-badge
使用該指令在元素右上角顯示徽標。
支持配置徽標的背景顏色、徽標形狀;支持傳入徽標上顯示的數(shù)字。
指令的代碼如下:
import Vue from 'vue' const SUCCESS = '#72c140' const ERROR = '#ed5b56' const WARNING = '#f0af41' const INFO = '#4091f7' const HEIGHT = 20 let flag = false export default { update (el, binding, vnode) { const { modifiers, value } = binding const modifiersKey = Object.keys(modifiers) let isDot = modifiersKey.includes('dot') let backgroundColor = '' if (modifiersKey.includes('success')) { backgroundColor = SUCCESS } else if (modifiersKey.includes('warning')) { backgroundColor = WARNING } else if (modifiersKey.includes('info')) { backgroundColor = INFO } else { backgroundColor = ERROR } const targetTemplate = isDot ? `<div style="position:absolute;top:-5px;right:-5px;height:10px;width:10px;border-radius:50%;background:${backgroundColor}"></div>` : `<div style="background:${backgroundColor};position:absolute;top:-${HEIGHT / 2}px;right:-${HEIGHT / 2}px;height:${HEIGHT}px;min-width:${HEIGHT}px;border-radius:${HEIGHT / 2}px;text-align:center;line-height:${HEIGHT}px;color:#fff;padding:0 5px;">${value}</div>` el.style.position = el.style.position || 'relative' const badge = Vue.extend({ template: targetTemplate }) const component = new badge().$mount().$el if (flag) { el.removeChild(el.lastChild) } el.appendChild(component) flag = true } }
參數(shù) Attributes:
然后你可以在模板中任何元素上使用新的 v-badge property,如下:
<div v-badge.dot.info="badgeCount" style="height:50px;width:50px;background:#999"> </div>
9、拖拽指令 v-drag
使用該指令可以對元素進行拖拽。
指令的代碼如下:
export default { let _el = el document.onselectstart = function() { return false //禁止選擇網(wǎng)頁上的文字 } _el.onmousedown = e => { let disX = e.clientX - _el.offsetLeft //鼠標按下,計算當前元素距離可視區(qū)的距離 let disY = e.clientY - _el.offsetTop document.onmousemove = function(e){ let l = e.clientX - disX let t = e.clientY - disY; _el.style.left = l + "px" _el.style.top = t + "px" } document.onmouseup = e => { document.onmousemove = document.onmouseup = null } return false } }
然后你可以在模板中任何元素上使用新的 v-drag property,如下:
<div v-drag> 支持拖拽的元素 </div>
10、響應縮放指令 v-resize
使用該指令可以響應元素寬高改變時執(zhí)行的方法。
指令的代碼如下:
export default { bind(el, binding) { let width = '', height = ''; function isReize() { const style = document.defaultView.getComputedStyle(el); if (width !== style.width || height !== style.height) { binding.value(); // 執(zhí)行傳入的方法 } width = style.width; height = style.height; } el.__timer__ = setInterval(isReize, 300); // 周期性監(jiān)聽元素是否改變 }, unbind(el) { clearInterval(el.__timer__); } }
參數(shù) Attributes:
然后你可以在模板中任何元素上使用新的 v-resize property,如下:
// 傳入 resize() 方法 <div v-resize="resize"></div>
11、字符串整形指令 v-format
使用該指令可以修改字符串,如使用 v-format.toFixed 保留兩位小數(shù)、 v-format.price 將內(nèi)容變成金額(每三位逗號分隔),可以同時使用,如 v-format.toFixed.price。
例如將數(shù)字 243112.331 變成 243112.33,或 243,112.33。
指令的代碼如下:
export default { update (el, binding, vnode) { const { value, modifiers } = binding if (!value) return let formatValue = value if (modifiers.toFixed) { formatValue = value.toFixed(2) } console.log(formatValue) if (modifiers.price) { formatValue = formatNumber(formatValue) } el.innerText = formatValue }, } function formatNumber (num) { num += ''; let strs = num.split('.'); let x1 = strs[0]; let x2 = strs.length > 1 ? '.' + strs[1] : ''; var rgx = /(\d+)(\d{3})/; while (rgx.test(x1)) { x1 = x1.replace(rgx, '$1' + ',' + '$2'); } return x1 + x2 }
參數(shù) Attributes:
然后你可以在模板中任何元素上使用新的 v-format property,如下:
<div v-format.toFixed.price="123333"> 123 </div>
如何使用這些指令?
為了便于管理指令,我們將每個指令都存在于單獨的 js 文件中。在項目的 src 下建一個 directives 目錄,目錄下新建 index.js 文件用于引入并注冊指令。
├── src | ├── directive | | ├── index.js | | ├── backtop.js | | ├── badge.js | | ├── copy.js | | ├── ellipsis.js | | ├── empty.js | | ├── expandClick.js | | ├── screenfull.js | | └── tooltips.js | ├── main.js
舉個例子:
directives 目錄下新建 ellipsis.js 文件:
export default function (el, binding) { el.style.width = binding.arg || 100 + 'px' el.style.whiteSpace = 'nowrap' el.style.overflow = 'hidden'; el.style.textOverflow = 'ellipsis'; }
directives 的 index.js 文件中引入 ellipsis 指令并注冊:
import Vue from 'vue' import ellipsis from './ellipsis' // 引入指令 // import other directives const directives = { ellipsis // other directives } Object.keys(directives).forEach(name => Vue.directive(name, directives[name]))
最后在 mian.js 中引入 index.js 文件:
import '@/directives/index'
這樣就可以正常使用這些指令了:
import '@/directives/index'
以上是“Vuejs中常用的自定義指令有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
分享題目:Vuejs中常用的自定義指令有哪些
文章路徑:http://jinyejixie.com/article2/jjjeoc.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供微信公眾號、面包屑導航、網(wǎng)站建設、品牌網(wǎng)站制作、商城網(wǎng)站、企業(yè)網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)