国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

vue3 可拖動的左右面板分割組件實現

瀏覽:9日期:2022-09-29 09:35:15
目錄分解組件左側面板右側面板入參分解propsslots具體實現如何拖動呢?事件監聽寬度處理優化buggit地址

最近在使用vue的時候,遇到一個需求,實現左右div可通過中間部分拖拽調整寬度,本文就整理一下,分享給大家,具體如下:

效果圖

vue3 可拖動的左右面板分割組件實現

分解組件

整體使用flex布局

左側面板 面板的具體內容通過slot具名插槽傳入。 title通過prop傳入 可拖動,為了保證內容樣式不會被拖動所破壞,對面板的寬度設定最大值/最小值右側面板 右側面板寬度隨著左側面板的寬度變化而變化,此處需注意,內容的寬度使用flex-auto自動適應。 需要做移動端的自適應。 自適應使用tailwind的媒體查詢

vue3 可拖動的左右面板分割組件實現

入參分解props @param {Number} maxWidth 最大寬度 @param {Number} minWidth 最小寬度 @param {String} leftTitle 左標題 @param {String} rightTitle 右標題? @param {Boolean} sotoreage 是否存儲與localstoregeslots left-content {Element} 左側內容 right-content {Element} 右側內容具體實現如何拖動呢?

在左側面板與右側面板之間添加一個隱藏的盒子,我將這個盒子隱藏在box-shadow之中。具體事件放在這個div中實現

<div class='w-2 cursor-move hidden md4:block'onMousedown={hnadleMouseDown}></div>事件監聽

const hnadleMouseDown = (evt: MouseEvent) => { /* 獲取起始點位,并存儲 */ let { pageX, pageY } = evt; basePosition.pageX = pageX; basePosition.pageY = pageY; /* 監聽鼠標的移動事件 */ document.addEventListener('mousemove', handleMouseMove); document.addEventListener('mouseup', handleMouseUp); }; const handleMouseMove = evt => { /* 阻止瀏覽器默認事件,防止觸發瀏覽器的手勢功能 */ evt.preventDefault(); /* 設置定時器,防止dom多次回流 */ clearTimeout(timer.value); timer.value = setTimeout(() => {let { pageX } = evt;const baseDiv = document.querySelector('.right-border-shadow');/* 處理寬度,是否處于最大值/最小值之間 */let baseWidth: Number | undefined = Number(baseDiv?.clientWidth) + (pageX - basePosition.pageX);baseWidth = baseWidth > Number(props?.maxWidth) ? props.maxWidth : baseWidth;baseWidth = Number(baseWidth) < Number(props?.minWidth) ? props.minWidth : baseWidth;baseDiv?.setAttribute('style', `width:${baseWidth}px`);/* emit寬度改變的事件 */ctx.emit('drugend');/* 存儲到store */setStore(baseWidth); }, 50); }; const handleMouseUp = evt => { /* 結束拖動之后,取消事件監聽,并emit出最終寬度 */ const width = document.querySelector('.right-border-shadow')?.clientWidth; document.removeEventListener('mousemove', handleMouseMove); document.removeEventListener('mouseup', handleMouseUp); ctx.emit('drugend', width); };寬度處理

style={`width:${ store.get('split-width') ? store.get('split-width') : props.minWidth ? props.minWidth : 384 }px`}優化

手動改變瀏覽器視窗寬度

nextTick(() => {ctx.emit('load', ctx);MutationObserver = window.MutationObserver;if (MutationObserver) { /* 監聽瀏覽器的窗口變化,在部分情況下需要這個api */ mo = new MutationObserver(function() { const __wm = document.querySelector('#rezie-id'); // 只在__wm元素變動才重新調用 __canvasWM if (!__wm) { // 避免一直觸發 mo.disconnect(); mo = null; ctx.emit('resize'); } }); mo.observe(document.querySelector('#rezie-id'), { attributes: true, subtree: true, childList: true, });} });

未生效,求指點

bug

父組件的onMounted鉤子中獲取子元素的slot元素節點報錯,為null。目前的解決辦法是在子組件的onMounted鉤子中拋出一個load事件,父組件使用onLoad去處理接下來的邏輯。

git地址

倉庫地址預覽地址

到此這篇關于vue3 可拖動的左右面板分割組件實現的文章就介紹到這了,更多相關vue3 可拖動左右分割面板內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Vue
相關文章:
主站蜘蛛池模板: 大桥未久在线精品视频在线 | 狠狠色丁香婷婷久久综合不卡 | 国产欧美成人一区二区三区 | 全免费a级毛片免费看 | 久久精品国产只有精品2020 | 国内精品久久影院 | 国产自精品在线 | 91挑色| 久久视频一区 | 久久久久国产一级毛片高清片 | 步兵社区在线观看 | 国产精品久久久久久免费播放 | 久久99亚洲精品一区二区 | 亚洲人成毛片线播放 | 美女脱了内裤张开腿让男人桶网站 | 国产三级在线观看a | 欧美精品一区二区在线观看播放 | 欧美午夜免费一级毛片 | 最新国产区 | 国产成人精品综合久久久 | 久久福利国产 | 国产一区二区亚洲精品天堂 | 色一伦一情一区二区三区 | 97在线视频免费 | 欧美一欧美一级毛片 | 三级精品 | 四色永久 | 越南高清幻女bbwxxxx | 免费观看国产精品 | 男女配种猛烈免费视频 | 99视频在线精品免费观看18 | a一级毛片免费高清在线 | 国产成在线观看免费视频成本人 | 黄色网址网站在线观看 | 波多野吉衣 免费一区 | 一级不卡毛片免费 | 欧美三级不卡视频 | 奇米5555 | 一级一片免费播放 | 精品久久中文字幕有码 | 免费视频男女 |