在Vuejs中,自訂一些指令對底層DOM進行操作。以下這篇文章總結分享一些常用的自訂指令程式碼,可以直接使用,提高開發效率!
【相關推薦:《vue.js教學》】
1、元素點選範圍擴充指令v- expandClick
使用此指令可以隱式的擴充元素的點擊範圍,由於借用偽元素實現,故不會影響元素在頁面上的排列佈局。
可傳入的參數為:上右下左擴展的範圍,單位 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) } }
參數Attributes:
然後你可以在模板中任何元素上使用新的v-expandClick property,如下:
<div v-expandClick="20,30,40,50" @click="glabClickoutside"> 点击范围扩大</div>
2、文字內容複製指令v-copy
使用該指令可以複製元素的文字內容(指令支援點擊複製v-copy、雙擊複製v- copy.dblclick、點選icon複製v-copy.icon 三種模式),不傳參數時,預設使用點選複製。
指令的程式碼如下:
export default { bind (el, binding) { // 双击触发复制 if (binding.modifiers.dblclick) { el.addEventListener('dblclick', () => handleClick(el.innerText)) el.style.cursor = 'copy' } // 点击icon触发复制 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' } // 单击触发复制 else { el.addEventListener('click', () => handleClick(el.innerText)) el.style.cursor = 'copy' } } } function handleClick (text) { // 创建元素 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) } // 复制内容 const input = document.getElementById('copyTarget') input.value = text input.select() document.execCommand('copy') // alert('复制成功') }
參數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 // 创建全屏图标 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' // 监听点击全屏事件 el.addEventListener('click', () => handleClick()) } } function handleClick () { if (!screenfull.isEnabled) { alert('浏览器不支持全屏') return } screenfull.toggle() }
參數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>` // 创建构造器 const tooltip = Vue.extend({ template: a }) // 创建一个 tooltip 实例并返回 dom 节点 const component = new tooltip().$mount() return component.$el }
參數Attributes:
然後你可以在模板中任何元素上使用新的v-tooltip property,如下:
<div v-tooltip:content='tootipParams'> 提示 </div>
範例:
<div v-tooltip:提示内容为XXX1> 提示1</div> <div v-tooltip:提示内容为XXX='tootipParams'> 提示2 </div>
為指令傳入element-ui 支援的參數:
data() { return { tootipParams: { placement: 'top', effect: 'light', } } }
5、文字超出省略指令v-ellipsis
使用該指令當文字內容超出寬度(預設100 px)時自動變成省略形式。等同於使用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'; }
參數Attributes:
然後你可以在範本中任何元素上使用新的v-ellipsis property,如下:
<div v-ellipsis:100> 需要省略的文字是阿萨的副本阿萨的副本阿萨的副本阿萨的副本</div>
6、回到頂部指令v-backtop
使用該指令可以讓頁面或指定元素回到頂部。
可選指定元素,如果不指定則全域頁面回到頂部。可選在元素偏移多少 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) { // 滚动到达参数值才出现绑定指令的元素 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' } }) } // 判断初始化状态 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') } }
參數Attributes:
然後你可以在模板中任何元素上使用新的v-backtop property,如下表示在id 為app 的元素滾動400px 後顯示綁定指令的元素:
<div v-backtop:app="400"> 回到顶部 </div>
也可以這樣使用,表示為一直顯示綁定指令的元素,並且是全域頁面回到頂部:
<div v-backtop> 回到顶部 </div>
7、空狀態指令v-empty
使用該指令可以顯示缺省的空狀態。可傳入預設圖片(可選,預設無圖片)、預設文字內容(可選,預設為暫無資料)、以及標示是否顯示空白狀態(必選)。
指令的程式碼如下:
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="/static/imghwm/default1.png" data-src="${img}" class="lazy" style="max-width:90%" style="max-width:90%" alt="分享一些Vuejs中常用的自訂指令(總結)" ></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 || '暂无数据'}</div> </div> </div>` }) const component = new empty().$mount().$el if (visible) { el.appendChild(component) } else { el.removeChild(el.lastChild) } }, }
#參數Attributes:
<div style="max-width:90%" v-empty="emptyValue"> 原本内容
需要传入一个参数对象,例如显示文字为:暂无列表,图片路径为 ../../assets/images/blue_big.png,控制标示 visible:
emptyValue = { content: '暂无列表', img: require('../../assets/images/blue_big.png'), visible: true, },
8、徽标指令 v-badge
使用该指令在元素右上角显示徽标。
支持配置徽标的背景颜色、徽标形状;支持传入徽标上显示的数字。
指令的代码如下:
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 } }
参数 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 //禁止选择网页上的文字 } _el.onmousedown = e => { let disX = e.clientX - _el.offsetLeft //鼠标按下,计算当前元素距离可视区的距离 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
使用该指令可以响应元素宽高改变时执行的方法。
指令的代码如下:
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(); // 执行传入的方法 } width = style.width; height = style.height; } el.__timer__ = setInterval(isReize, 300); // 周期性监听元素是否改变 }, unbind(el) { clearInterval(el.__timer__); } }
参数 Attributes:
然后你可以在模板中任何元素上使用新的 v-resize property,如下:
// 传入 resize() 方法 <div v-resize="resize"></div>
11、字符串整形指令 v-format
使用该指令可以修改字符串,如使用 v-format.toFixed 保留两位小数、 v-format.price 将内容变成金额(每三位逗号分隔),可以同时使用,如 v-format.toFixed.price。
例如将数字 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 }
参数 Attributes:
然后你可以在模板中任何元素上使用新的 v-format property,如下:
<div> 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中常用的自訂指令(總結)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Netflix在框架選擇上主要考慮性能、可擴展性、開發效率、生態系統、技術債務和維護成本。 1.性能與可擴展性:選擇Java和SpringBoot以高效處理海量數據和高並發請求。 2.開發效率與生態系統:使用React提升前端開發效率,利用其豐富的生態系統。 3.技術債務與維護成本:選擇Node.js構建微服務,降低維護成本和技術債務。

Netflix主要使用React作為前端框架,輔以Vue用於特定功能。 1)React的組件化和虛擬DOM提升了Netflix應用的性能和開發效率。 2)Vue在Netflix的內部工具和小型項目中應用,其靈活性和易用性是關鍵。

Vue.js是一種漸進式JavaScript框架,適用於構建複雜的用戶界面。 1)其核心概念包括響應式數據、組件化和虛擬DOM。 2)實際應用中,可以通過構建Todo應用和集成VueRouter來展示其功能。 3)調試時,建議使用VueDevtools和console.log。 4)性能優化可通過v-if/v-show、列表渲染優化和異步加載組件等實現。

Vue.js適合小型到中型項目,而React更適用於大型、複雜應用。 1.Vue.js的響應式系統通過依賴追踪自動更新DOM,易於管理數據變化。 2.React採用單向數據流,數據從父組件流向子組件,提供明確的數據流向和易於調試的結構。

Vue.js適合中小型項目和快速迭代,React適用於大型複雜應用。 1)Vue.js易於上手,適用於團隊經驗不足或項目規模較小的情況。 2)React的生態系統更豐富,適合有高性能需求和復雜功能需求的項目。

實現 Vue 中 a 標籤跳轉的方法包括:HTML 模板中使用 a 標籤指定 href 屬性。使用 Vue 路由的 router-link 組件。使用 JavaScript 的 this.$router.push() 方法。可通過 query 參數傳遞參數,並在 router 選項中配置路由以進行動態跳轉。

Vue 中實現組件跳轉有以下方法:使用 router-link 和 <router-view> 組件進行超鏈接跳轉,指定 :to 屬性為目標路徑。直接使用 <router-view> 組件顯示當前路由渲染的組件。使用 router.push() 和 router.replace() 方法進行程序化導航,前者保存歷史記錄,後者替換當前路由不留記錄。

Vue 中 div 元素跳轉的方法有兩種:使用 Vue Router,添加 router-link 組件。添加 @click 事件監聽器,調用 this.$router.push() 方法跳轉。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Dreamweaver CS6
視覺化網頁開發工具

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

禪工作室 13.0.1
強大的PHP整合開發環境

WebStorm Mac版
好用的JavaScript開發工具