mypreciousʲôÒâ˼"/> 2024-10-31 11:38¡¤Í£Áô¿´ÌåÓý"/>
¡¶mypreciousʲôÒâ˼¡·¾çÇé¼ò½é£º2024-10-31 11:38¡¤Í£Áô¿´ÌåÓýËæ¼´ÓÖ˵µÀÄã²»»áÊÇÏëÒªÎÒ½øÈ¥°Ñ¾Îı³ÏÂÀ´Äî¸øÄãÌý°ÉÕâ°ì·¨ÐÐÇ·ºàµÄÄǾÎÄÎÒ¼û¹ýÎÞÊý´ÎÁ˵«µ½ÏÖÔÚΪֹȴÊÇÁ¬Ò»¸ö×ÖÒ²Ïë²»ÆðÀ´mypreciousʲôÒâ˼Äã¾Í¶ãÔÚÒ»±ßÌýµ½ÓÐÐÂÎÅÄã¾ÍµãÉÏ»ðÈÓ³öÈ¥µ½Ê±¼ä¾ÍÊÇËûÃÇÔÚÃ÷ÎÒÃÇÔÚ°µÀϹ¤½³Ò²ÒªÑ§ÐÂÊÖÒÕ´Þ´ºá°ËµÏÖÔÚ´ÓÊý×Ö»¯½¨Ä£»·½Úµ½´òÓ¡À¯Ä£ÔÙµ½ÊµÑùÆÊÎöËû¶¼ÊìÖª²Ù×÷ÔÀíºÍÊÖÒÕÔÙÍŽá×Ô¼º40ÄêµÄÊÖ¹¤ÖÆ×÷ÂÄÀú¸ü¸ßЧµØÖ¸µ¼ÄêÇáÒ»´ú¹¤½³Íê³ÉÊý×Ö»¯µÄ²úÆ·Éè¼ÆÓëÉú²ú
¡¶mypreciousʲôÒâ˼¡·ÊÓÆµËµÃ÷£ºÃîÔÕÕâʱÎíÆøÉ¢È¥·¿°²ÀÙÑÛǰ¹ÛÖ®ÉñÉ«·ÉÑïÈ̲»×¡ÔÞ̾×÷ÉùÔÚÕâ½Ú×à½ô´Õ¡¢ÄÞºçÉÁׯ¡¢¸ßÂ¥ÁÖÁ¢µÄÌìÏÂÖ®ÖÐÓÐÒ»×ù¶¼»á¾²Ú×µØÒþÄäÔÚ´óµØÖ®ÉÏÈÎÓÉËêÔÂÇáÇḧÃþÍðÈç¾²´ý×ÅÈËÃÇÈ¥·¢Ã÷ËýÕâ¼´ÊÇÀÖɽһ×ùµÍµ÷¶ø¸»ÓÐ÷ÈÁ¦µÄ¶¼»á¹ãÖÝ»òÐíÒòÆä·±»ª¶øÒýÈËעĿµ«ÀÖɽÔÚÆä×ÔÎҵ͵÷µÄÆø·ÕÖÐÈ´Õ¹ÏÖ³öÎÞ·¨ºöÊӵķ緶Vue×Ô½ç˵ָÁî2021-04-14 12:13¡¤Ç°¶ËCold³ýÁ˽¹µã¹¦Ð§Ä¬ÈÏÄÚÖõÄÖ¸Áî (v-model ºÍ v-show)Vue Ò²ÔÊÐí×¢²á×Ô½ç˵ָÁî×Ô¶¯×¢²áÖ¸Áîн¨ directives/index.jsÎļþimport copy from './copy'import longpress from './longpress'import permission from './permission'import debounce from './debounce'import emoji from './emoji'import LazyLoad from './LazyLoad'import waterMarker from './waterMarker'import draggable from './draggable'// ×Ô½ç˵ָÁîconst directives = { copy, longpress, permission, debounce, emoji, LazyLoad, waterMarker, draggable}export default { install(Vue) { Object.keys(directives).forEach((key) => { Vue.directive(key, directives[key]) }) },}ÔÚ main.js ÎļþÒýÈëimport Vue from 'vue'import directives from '@/directives'Vue.use(directives)v-copyʵÏÖÒ»¼ü¸´ÖÆÎı¾ÄÚÈÝÓÃÓÚÊó±êÓÒ¼üÕ³Ìù¶¯Ì¬½¨Éè textarea ±êÇ©²¢ÉèÖà readOnly ÊôÐÔ¼°ÒƳö¿ÉÊÓÇøÓò½«Òª¸´ÖƵÄÖµ¸³¸ø textarea ±êÇ©µÄ value ÊôÐÔ²¢²åÈëµ½ bodyÑ¡ÖÐÖµ textarea ²¢¸´Öƽ« body ÖвåÈëµÄ textarea ÒÆ³ýÔÚµÚÒ»´ÎŲÓÃʱ°ó¶¨ÊÂÎñÔÚ½â°óÊ±ÒÆ³ýÊÂÎñconst copy = { bind(el, { value }) { el.$value = value el.handler = () => { if (!el.$value) { // ֵΪ¿ÕµÄʱ¼ä¸ø³öÌáÐÑ¿ÉÆ¾Ö¤ÏîÄ¿UI×ÐϸÉè¼Æ console.log('ÎÞ¸´ÖÆÄÚÈÝ') return } // ¶¯Ì¬½¨Éè textarea ±êÇ© const textarea = document.createElement('textarea') // ½«¸Ã textarea ÉèΪ readonly ±ÜÃâ iOS ÏÂ×Ô¶¯»½Æð¼üÅÌͬʱ½« textarea ÒÆ³ö¿ÉÊÓÇøÓò 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() const result = document.execCommand('Copy') if (result) { console.log('¸´ÖÆÀÖ³É') // ¿Éƾ֤ÏîÄ¿UI×ÐϸÉè¼Æ } document.body.removeChild(textarea) } // °ó¶¨µã»÷ÊÂÎñ¾ÍÊÇËùνµÄÒ»¼ü copy À² el.addEventListener('click', el.handler) }, // µ±´«½øÀ´µÄÖµ¸üеÄʱ¼ä´¥·¢ componentUpdated(el, { value }) { el.$value = value }, // Ö¸ÁîÓëÔªËØ½â°óµÄʱ¼äÒÆ³ýÊÂÎñ°ó¶¨ unbind(el) { el.removeEventListener('click', el.handler) },}export default copy v-longpressʵÏÖ³¤°´Óû§ÐèÒª°´Ï²¢°´×¡°´Å¥¼¸ÃëÖÓ´¥·¢ÏìÓ¦µÄÊÂÎñ½¨ÉèÒ»¸ö¼ÆÊ±Æ÷ 2 ÃëºóÖ´Ðк¯Êýµ±Óû§°´Ï°´Å¥Ê±´¥·¢ mousedown ÊÂÎñÆô¶¯¼ÆÊ±Æ÷£»Óû§ËÉ¿ª°´Å¥Ê±Å²Óà mouseout ÊÂÎñÈôÊÇ mouseup ÊÂÎñ 2 ÃëÄÚ±»´¥·¢¾Íɨ³ý¼ÆÊ±Æ÷¿´³ÉÒ»¸öͨË׵ĵã»÷ÊÂÎñÈôÊǼÆÊ±Æ÷ûÓÐÔÚ 2 ÃëÄÚɨ³ýÔòÅжÏΪһ´Î³¤°´¿ÉÒÔÖ´ÐйØÁªµÄº¯ÊýÔÚÒÆ¶¯¶ËҪ˼Á¿ touchstarttouchend ÊÂÎñconst longpress = { bind: function (el, binding, vNode) { if (typeof binding.value !== 'function') { throw 'callback must be a function' } // ½ç˵±äÁ¿ let pressTimer = null // ½¨Éè¼ÆÊ±Æ÷£¨ 2ÃëºóÖ´Ðк¯Êý £© let start = (e) => { if (e.type === 'click' && e.button !== 0) { return } if (pressTimer === null) { pressTimer = setTimeout(() => { handler() }, 2000) } } // ×÷·Ï¼ÆÊ±Æ÷ let cancel = (e) => { if (pressTimer !== null) { clearTimeout(pressTimer) pressTimer = null } } // ÔËÐк¯Êý const handler = (e) => { binding.value(e) } // Ìí¼ÓÊÂÎñ¼àÌýÆ÷ el.addEventListener('mousedown', start) el.addEventListener('touchstart', start) // ×÷·Ï¼ÆÊ±Æ÷ el.addEventListener('click', cancel) el.addEventListener('mouseout', cancel) el.addEventListener('touchend', cancel) el.addEventListener('touchcancel', cancel) }, // µ±´«½øÀ´µÄÖµ¸üеÄʱ¼ä´¥·¢ componentUpdated(el, { value }) { el.$value = value }, // Ö¸ÁîÓëÔªËØ½â°óµÄʱ¼äÒÆ³ýÊÂÎñ°ó¶¨ unbind(el) { el.removeEventListener('click', el.handler) },}export default longpress v-debounce±ÜÃâ°´Å¥ÔÚ¶Ìʱ¼äÄÚ±»¶à´Îµã»÷ʹÓ÷À¶¶º¯ÊýÏÞÖÆ»®×¼Ê±¼äÄÚÖ»Äܵã»÷Ò»´Î½ç˵һ¸öÑÓ³ÙÖ´ÐеÄÒªÁìÈôÊÇÔÚÑÓ³Ùʱ¼äÄÚÔÙŲÓøÃÒªÁìÔòÖØÐÂÅÌËãÖ´ÐÐʱ¼ä½«Ê±¼ä°ó¶¨ÔÚ click ÒªÁìÉÏconst debounce = { inserted: function (el, binding) { let timer el.addEventListener('keyup', () => { if (timer) { clearTimeout(timer) } timer = setTimeout(() => { binding.value() }, 1000) }) },}export default debounce v-emoji¿ª·¢ÖÐÓöµ½µÄ±íµ¥ÊäÈëÍùÍù»áÓжÔÊäÈëÄÚÈݵÄÏÞÖÆºÃ±È²»¿ÉÊäÈëÐÄÇéºÍÌØÊâ×Ö·ûÖ»ÄÜÊäÈëÊý×Ö»ò×ÖĸµÈƾ֤ÕýÔò±í´ïʽÉè¼Æ×Ô½ç˵´¦Öóͷ£±íµ¥ÊäÈë¹æÔòµÄÖ¸ÁîÏÂÃæÒÔեȡÊäÈëÐÄÇéºÍÌØÊâ×Ö·ûΪÀýlet findEle = (parent, type) => { return parent.tagName.toLowerCase() === type ? parent : parent.querySelector(type)}const trigger = (el, type) => { const e = document.createEvent('HTMLEvents') e.initEvent(type, true, true) el.dispatchEvent(e)}const emoji = { bind: function (el, binding, vnode) { // ÕýÔò¹æÔò¿Éƾ֤ÐèÇó×Ô½ç˵ var regRule = /[^u4E00-u9FA5|d|a-zA-Z|rns,.?!¡¡ª&$=()-+/*{}[]]|s/g let $inp = findEle(el, 'input') el.$inp = $inp $inp.handle = function () { let val = $inp.value $inp.value = val.replace(regRule, '') trigger($inp, 'input') } $inp.addEventListener('keyup', $inp.handle) }, unbind: function (el) { el.$inp.removeEventListener('keyup', el.$inp.handle) },}export default emoji v-LazyLoadʵÏÖÒ»¸öͼƬÀÁ¼ÓÔØÖ¸ÁîÖ»¼ÓÔØä¯ÀÀÆ÷¿É¼ûÇøÓòµÄͼƬͼƬÀÁ¼ÓÔØµÄÔÀíÖ÷ÒªÊÇÅжÏÄ¿½ñͼƬÊÇ·ñµ½ÁË¿ÉÊÓÇøÓòÕâÒ»½¹µãÂ߼ʵÏÖµÄÄõ½ËùÓеÄͼƬ Dom ±éÀúÿ¸öͼƬÅжÏÄ¿½ñͼƬÊÇ·ñµ½ÁË¿ÉÊÓÇø¹æÄ£ÄÚÈôÊǵ½Á˾ÍÉèÖÃͼƬµÄ src ÊôÐÔ²»È»ÏÔʾĬÈÏͼƬͼƬÀÁ¼ÓÔØÓÐÁ½ÖÖ·½·¨¿ÉÒÔʵÏÖÒ»ÊÇ°ó¶¨ srcoll ÊÂÎñ¾ÙÐмàÌý¶þÊÇʹÓà IntersectionObserver ÅжÏͼƬÊÇ·ñµ½ÁË¿ÉÊÓÇøÓò¿ÉÊÇÓÐä¯ÀÀÆ÷¼æÈÝÐÔÎÊÌâÏÂÃæ·â×°Ò»¸öÀÁ¼ÓÔØÖ¸Áî¼æÈÝÁ½ÖÖÒªÁìÅжÏä¯ÀÀÆ÷ÊÇ·ñÖ§³Ö IntersectionObserver APIÈôÊÇÖ§³Ö¾ÍʹÓà IntersectionObserver ʵÏÖÀÁ¼ÓÔØ²»È»ÔòʹÓà srcoll ÊÂÎñ¼àÌý + ½ÚÔ¼µÄÒªÁìʵÏÖconst LazyLoad = { // installÒªÁì install(Vue, options) { const defaultSrc = options.default Vue.directive('lazy', { bind(el, binding) { LazyLoad.init(el, binding.value, defaultSrc) }, inserted(el) { if (IntersectionObserver) { LazyLoad.observe(el) } else { LazyLoad.listenerScroll(el) } }, }) }, // ³õʼ»¯ init(el, val, def) { el.setAttribute('data-src', val) el.setAttribute('src', def) }, // ʹÓÃIntersectionObserver¼àÌýel observe(el) { var io = new IntersectionObserver((entries) => { const realSrc = el.dataset.src if (entries[0].isIntersecting) { if (realSrc) { el.src = realSrc el.removeAttribute('data-src') } } }) io.observe(el) }, // ¼àÌýscrollÊÂÎñ listenerScroll(el) { const handler = LazyLoad.throttle(LazyLoad.load, 300) LazyLoad.load(el) window.addEventListener('scroll', () => { handler(el) }) }, // ¼ÓÔØÕæÊµÍ¼Æ¬ load(el) { const windowHeight = document.documentElement.clientHeight const elTop = el.getBoundingClientRect().top const elBtm = el.getBoundingClientRect().bottom const realSrc = el.dataset.src if (elTop - windowHeight < 0 && elBtm > 0) { if (realSrc) { el.src = realSrc el.removeAttribute('data-src') } } }, // ½ÚÔ¼ throttle(fn, delay) { let timer let prevTime return function (...args) { const currTime = Date.now() const context = this if (!prevTime) prevTime = currTime clearTimeout(timer) if (currTime - prevTime > delay) { prevTime = currTime fn.apply(context, args) clearTimeout(timer) return } timer = setTimeout(function () { prevTime = Date.now() timer = null fn.apply(context, args) }, delay) } },}export default LazyLoadv-permission×Ô½ç˵һ¸öȨÏÞÖ¸Áî¶ÔÐèҪȨÏÞÅÐ¶ÏµÄ Dom ¾ÙÐÐÏÔʾÒþ²Ø»ñȡһ¸öȨÏÞÊý×éÊý¾ÝÅжÏÓû§µÄȨÏÞÊÇ·ñÔÚÕâ¸öÊý×éÄÚÈôÊÇÊÇÔòÏÔʾ²»È»ÔòÒÆ³ý Domimport Store from '@/store'const permission = { inserted: function (el, binding) { const value = binding.value; if (value) { const permission = Store.getters.permission; if (!permission.includes(value)) { el.parentNode && el.parentNode.removeChild(el) } } },}export default permission
¼ûµ½ËÎÍòÈ«µÄÉñÇéÁÖÔ¾ÂíÉÏËÉÁË¿ÚÎÇËûÊʲÅÒѾ×öºÃ¶öÁ˸¹±³ÊܵеÄ×¼±¸¿ÉÊÇÏÖÔÚ¿´À´ÀÏÌìÕվɺÜÕÕ¹ËËûµÄÏÖÔÚËû²»µ«½öÊÇÉÙÁËÒ»¸ö³ðÈËÕâô¼òÆÓ¶øÊǶàÁËÒ»¸öÅóÙ¶àÒ»¸öÅóÙ±ÈÉÙÁ½¸ö³ðÈ˶¼ÖµÃ»¶à¾ÃÓðõüÀïµÄ¾Æ±ã¼ûÁ˵×
2025-10-16 16:29:09