午夜剧场伦理_日本一道高清_国产又黄又硬_91黄色网战_女同久久另类69精品国产_妹妹的朋友在线

您的位置:首頁技術(shù)文章
文章詳情頁

vue模塊移動組件的實現(xiàn)示例

瀏覽:35日期:2023-01-19 17:03:13

一直都想實現(xiàn)類似于五百丁中簡歷填寫中模塊跟隨鼠標(biāo)移動的組件,最近閑來無事,自己琢磨實現(xiàn)了一個差不多的組件。

vue模塊移動組件的實現(xiàn)示例

其中每個模塊都是組件調(diào)入(項目經(jīng)驗、教育經(jīng)驗、工作經(jīng)驗等),所以這里也用到了動態(tài)加載組件方式。

思路:鼠標(biāo)移入模塊,顯示相應(yīng)模塊的點擊移動按鈕,點擊A模塊移動按鈕,此時原先A模塊所在的位置上變?yōu)橥蟿拥竭@里綠框模塊,同時鼠標(biāo)下懸浮著A模塊,鼠標(biāo)移動,懸浮的A模塊跟隨移動,綠框也跟隨上下移動。

父組件

1、父組件template中的代碼

<div ref='compBox'> <component v-for='(item, index) in comRoute' :is='item' :key='index' @getData='getData'></component> <div : ref='translateBox' v-if='transType'> <component :is='transCom'></component> </div></div>

2、data中定義的屬性

comList: [’educationExp’, ’workExp’, ’projectExp’], // 模塊列表comLen: 0, // 模塊的長度comType: ’’, // 當(dāng)前移動的模塊transType: ’’, // 當(dāng)前移動的模塊coordinate: { // 鼠標(biāo)坐標(biāo) mouseX: 0, mouseY: 0,},downFlag: false, // 當(dāng)前是否點擊模塊移動mouseYBefore: 0, // 記錄鼠標(biāo)點擊時Y坐標(biāo)以及鼠標(biāo)每移動30后重新記錄鼠標(biāo)Y坐標(biāo)mouseYLast: 0, // 實時記錄鼠標(biāo)移動時的Y坐標(biāo)nowCom: ’’, // 移動模塊時,上一個模塊或者下一個模塊的名稱forFlage: false, // forEach遍歷結(jié)束的標(biāo)識comRoute: [], // 動態(tài)加載組件列表transCom: null, // 點擊后懸浮的組件compBox: null, // 獲取當(dāng)前組件在頁面中的位置信息

3、scrollTop為頁面滾動的距頂部的距離,從父組件傳過來

props: { scrollTop: Number,}

4、watch一些屬性

watch: { comList: { handler(val) { this.getCom(val); // 模塊列表改變時,實時加載組件 }, deep: true, immediate: true, // 聲明了之后會立馬執(zhí)行handler里面的函數(shù) }, transType(val) { // 懸浮模塊加載組件 if (val) { this.transCom = () => import(`./default/${val}`); } }, scrollTop: { // 監(jiān)聽頁面滾動 handler() {}, immediate: true, }, comType(newVal) { if (newVal) { this.comList.forEach((item, index) => { if (item === newVal) { this.comList[index] = ’moveBox’; // 將組建列表中為comType的元素改為moveBox組件 } }); this.getCom(this.comList); } }, downFlag(newVal) { // 鼠標(biāo)已經(jīng)點擊 const nowThis = this; document.onmousemove = function (e) { if (newVal) { // 鼠標(biāo)移動賦值 nowThis.coordinate.mouseX = e.clientX; nowThis.coordinate.mouseY = e.clientY; } }; document.onmouseup = function () { // 鼠標(biāo)松開 document.onmousemove = null; if (newVal) { nowThis.transType = ’’; // 懸浮組件置空 nowThis.comList.forEach((item, index) => { if (item === ’moveBox’) { // 尋找moveBox所在位置 nowThis.comList[index] = nowThis.comType; // 還原成點擊組件 } }); nowThis.downFlag = false; nowThis.comType = ’’; nowThis.getCom(nowThis.comList); } }; }, coordinate: { handler(newVal) { // 懸浮組件位置 this.$refs.translateBox.style.top = `${newVal.mouseY + this.scrollTop - 40 - this.compBox.y}px`; this.$refs.translateBox.style.left = `${newVal.mouseX - this.compBox.x - 200}px`; this.mouseYLast = newVal.mouseY; }, deep: true, }, mouseYLast(newVal) { // 鼠標(biāo)移動Y坐標(biāo) this.forFlage = false; if (newVal - this.mouseYBefore > 30) { // 移動30鼠標(biāo)向下移,每移動30,moveBox移動一次 this.comList.forEach((item, index) => { if (item === ’moveBox’ && index < this.comLen - 1 && !this.forFlage) { this.nowCom = this.comList[index + 1]; this.$set(this.comList, index + 1, ’moveBox’); this.$set(this.comList, index, this.nowCom); this.mouseYBefore = newVal; this.forFlage = true; } }); } else if (newVal - this.mouseYBefore < -30) { // 鼠標(biāo)向上移 this.comList.forEach((item, index) => { if (item === ’moveBox’ && index > 0 && !this.forFlage) { this.nowCom = this.comList[index - 1]; // this.comList[index - 1] = ’moveBox’; // this.comList[index] = this.nowCom; // this.comList[index]數(shù)組中采用這種方式賦值,vue是不能檢測到數(shù)組的變動的 this.$set(this.comList, index - 1, ’moveBox’); this.$set(this.comList, index, this.nowCom); this.mouseYBefore = newVal; this.forFlage = true; } }); } },},

其中 forFlage的作用是,在forEach中不能使用break這樣來結(jié)束循環(huán),所以用forFlage來表示,當(dāng)遍歷到moveBox后, 就結(jié)束遍歷

5、methods

methods: { getCom(val) { this.comRoute = []; val.forEach((item) => { this.comRoute.push(() => import(`./default/${item}`)); }); }, getData(data, dataY, dataX) { // 模塊組件點擊后,父組件中調(diào)用此方法,并傳值過來 this.comType = data; this.transType = data; // 目前考慮點擊后立即移動,點擊不移動的情況后期再考慮 this.downFlag = true; this.mouseYBefore = dataY; this.$nextTick(() => { this.$refs.translateBox.style.top = `${dataY + this.scrollTop - 40 - this.compBox.y}px`; this.$refs.translateBox.style.left = `${dataX - this.compBox.x - 200}px`; }); },},

6、mounted

mounted() { this.comLen = this.comList.length; this.compBox = this.$refs.compBox.getBoundingClientRect(); const that = this; window.onresize = () => (() => { that.compBox = this.$refs.compBox.getBoundingClientRect(); })();},

子組件

1、子組件template代碼

<div class='pad-box hover-box name-box'> <p class='absolute-box'> <i @mousedown='mouseDown'></i> <i class='el-icon-circle-plus operation-icon'></i> <i class='el-icon-s-tools operation-icon'></i> </p> 教育經(jīng)驗</div>

2、script

export default { name: ’educationExp’, data() { return { comType: ’educationExp’, mouseYBefore: 0, mouseXBefore: 0, }; }, methods: { mouseDown(e) { this.mouseYBefore = e.clientY; this.mouseXBefore = e.clientX; this.$emit(’getData’, this.comType, this.mouseYBefore, this.mouseXBefore); }, },};

到此這篇關(guān)于vue模塊移動組件的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)vue模塊移動組件內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Vue
相關(guān)文章:
主站蜘蛛池模板: 93久久精品日日躁夜夜躁欧美 | 国产一级视频在线观看 | 久久精品偷拍视频 | 国产一区二区三区视频 | 国产56页 | 农村少妇久久久久久久 | 国产专区第一页 | 国产福利在线视频 | 欧美激情图片小说 | 在线观看成人 | 国产无遮挡又黄又爽又色视频 | 中文字幕三区 | 国产女人18毛片水18精品 | 四虎国产成人永久精品免费 | 亚洲一级精品 | 警花观音坐莲激情销魂小说 | 欧美一级网 | 亚洲精品久久久久久国 | 国产精品久久久久久久成人午夜 | 91狠狠操 | 日韩av中文| 亚洲另类欧美日韩 | 18久久| 在线成人免费观看 | 国产精品午夜影院 | 中文字幕日本在线 | 亚洲欧美日韩在线播放 | 青青草97国产精品麻豆 | 97狠狠| 亚洲免费黄色 | 精品视频久久久久 | 韩国成人在线视频 | 性欧美一区 | xxxx精品| 青娱乐成人 | jizzjizzjizz亚洲女 | 丁香社区五月天 | 国产亚洲精品久久久久久豆腐 | 一区二区三区免费在线观看视频 | 日韩乱码一区二区三区 | 中文字幕免费高清 |