Vuejs에서는 기본 DOM에서 작동하도록 일부 지침을 사용자 정의합니다. 다음 문서에서는 개발 효율성을 향상시키기 위해 직접 사용할 수 있는 일반적으로 사용되는 일부 사용자 정의 명령 코드를 요약하고 공유합니다!
【관련 추천: "vue.js tutorial"】
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) } }
매개변수 속성:
그런 다음 다음과 같이 템플릿의 모든 요소에 새로운 v-expandClick 속성을 사용할 수 있습니다.
<div v-expandClick="20,30,40,50" @click="glabClickoutside"> 点击范围扩大</div>
2. v-copy
이 명령을 사용하여 요소의 텍스트 내용을 복사합니다(명령은 세 가지 모드를 지원합니다: v-copy를 복사하려면 클릭, v-copy.dblclick을 복사하려면 두 번 클릭, 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('复制成功') }
매개변수 속성:
그런 다음 다음과 같이 템플릿의 모든 요소에 새로운 v-copy 속성을 사용할 수 있습니다.
<div v-copy> 单击复制 </div> <div v-copy.dblclick> 双击复制 </div> <div v-copy.icon> icon复制 </div>
3. 전체 화면 지침 v-screenfull
전체 화면 명령, 전체 화면 작업을 수행하거나 전체 화면 작업을 종료하려면 요소를 클릭하세요. 요소 뒤에 요소 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() }
매개변수 속성:
그런 다음 다음과 같이 템플릿의 모든 요소에 새로운 v-screenfull 속성을 사용할 수 있습니다.
<div v-screenfull.icon> 全屏 </div>
4. 설명 지시문 v-tooltip
element-ui의 el-tooltip과 마찬가지로 요소에 설명을 추가합니다(물음표 아이콘은 마우스로 덮은 후 설명 텍스트를 표시합니다).
지시문의 코드는 다음과 같습니다.
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 }
매개변수 속성:
그런 다음 다음과 같이 템플릿의 모든 요소에 새 v-tooltip 속성을 사용할 수 있습니다.
<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를 초과합니다.
텍스트 내용이 너비(기본값 100px). 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'; }
매개변수 속성:
그런 다음 모든 요소에 새로운 v-ellipsis 속성을 사용할 수 있습니다.
<div v-ellipsis:100> 需要省略的文字是阿萨的副本阿萨的副本阿萨的副本阿萨的副本</div>
6. 맨 위로 가기 명령 v-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') } }
매개변수 속성:
그런 다음 아래와 같이 템플릿의 모든 요소에 새로운 v-backtop 속성을 사용할 수 있습니다. 400px 스크롤하면 앱 ID가 표시됩니다. 바인딩 명령 요소:
<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="${img}" 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) } }, }
매개변수 속성:
그런 다음 템플릿의 모든 요소에 새로운 v-empty 속성을 사용하여 다음과 같이 객체emptyValue를 전달할 수 있습니다. :
<div style="height:500px;width:500px" 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!