Vue3.0利用vue-grid-layout插件實現(xiàn)拖拽布局
1、插件
首先,我們選擇的插件是vue-grid-layout
npm i vue-grid-layout --save
官網(wǎng):https://jbaysolutions.github....
2、插曲
安裝完依賴,發(fā)現(xiàn)項目能啟動起來,按照官網(wǎng)demo發(fā)現(xiàn)頁面空白,控制臺提示沒有找到子組件
改變思路,不使用局部引入組件,使用全局引入組件。
3、實現(xiàn)
const layout = ref<LayoutItem[]>([
{ x: 0, y: 0, w: 1, h: 1, i: 0 },
{ x: 1, y: 0, w: 2, h: 1, i: 1 },
{ x: 0, y: 1, w: 2, h: 1, i: 2 },
{ x: 0, y: 2, w: 3, h: 1, i: 3 },
{ x: 2, y: 1, w: 1, h: 1, i: 4 },
]);
<grid-layout
:layout="layout"
:col-num="3"
:row-height="240"
:is-draggable="true"
:is-resizable="true"
:is-mirrored="false"
:maxRows="3"
:vertical-compact="true"
:margin="[10, 10]"
:use-css-transforms="true"
>
<grid-item
v-for="item in layout"
:x="item.x"
:y="item.y"
:w="item.w"
:h="item.h"
:i="item.i"
:key="item.i"
@moved="onItemMoved"
>{{ item.i }}</grid-item>
</grid-layout>
效果:

但是!!
這里拖拽完沒有判斷每一行是否填充滿且拖拽后有模塊會被覆蓋導(dǎo)致出現(xiàn)空白區(qū)域,如下:

思考:
我們需要增加校驗,校驗每一行是否填充滿
4、校驗函數(shù)
import { LayoutItem } from '../types/index';
import { cloneDeep } from 'lodash'
/**
* 校驗布局是否合法
* 1.深拷貝數(shù)組,避免污染原數(shù)組
* 2.拿到y(tǒng)的最大值 用于遍歷
* 3.拿到每個y的分?jǐn)?shù)組 按照x升序排列
* 4.如果數(shù)組長度為1判斷w是否等于最大x
* 5.如果數(shù)組長度不為1 遍歷數(shù)組 判斷每個元素的w是否等于下一個元素的x 累加w判斷總和是否等于最大x
* 6.如果合法則返回false
* @param list
* @returns
*/
export const verifyLayout = (list: Array<LayoutItem>): boolean => {
let yList = list.map(item => { return item.y });
yList = yList.sort((a, b) => { return a - b });
console.log(list);
const newArr = cloneDeep(list);
let flag = false;
const maxY = yList[yList.length - 1];
const maxX = 3;
console.log(maxY);
for (let i = 0; i <= maxY; i++) {
let arr = newArr.filter((item: LayoutItem) => {
return item.y === i;
});
console.log(arr, arr.length);
if (arr && arr.length > 1) {
console.log('多個個-------------------', i);
let calValue = 0;
arr = arr.sort((a: LayoutItem, b: LayoutItem) => { return a.x - b.x })
arr.forEach((childItem: LayoutItem, index: number) => {
calValue += childItem.w;
console.log('calValue--------------', calValue, index);
if (index !== arr.length - 1 && calValue !== arr[index + 1].x) {
flag = true;
}
if (index === arr.length - 1 && calValue !== maxX) {
flag = true;
}
})
} else {
console.log('只有一個-------------------', i);
if (arr[0].w !== maxX) {
flag = true
}
}
}
console.log(flag);
return flag;
}
思路的話就是我在函數(shù)上的注釋。
在每次拖拽完成的回調(diào)函數(shù)中進行校驗
/**
* 拖拽完成事件
* 1.將之前的數(shù)據(jù)存儲到history數(shù)據(jù)中
* 2.然后再將移動完成的數(shù)據(jù)存儲到nowlayout數(shù)據(jù)中
*/
const onItemMoved = () => {
console.log('moved--------------------')
historyDataList.value.push(cloneDeep(nowLayoutData.value));
nowLayoutData.value = cloneDeep(layout.value);
// const flag = verifyLayout(layout.value);
// if (flag) {
// goBack()
// }
};
const goBack = () => {
console.log(historyDataList.value[historyDataList.value.length - 1]);
layout.value = historyDataList.value[historyDataList.value.length - 1];
nowLayoutData.value = cloneDeep(layout.value);
historyDataList.value.pop();
}
這樣的話每次我們拖拽完校驗如果不合法就會回滾,就能保證每一行填充滿了?。。。?/p>
到此這篇關(guān)于Vue3.0利用vue-grid-layout插件實現(xiàn)拖拽布局的文章就介紹到這了,更多相關(guān)Vue3 利用vue-grid-layout插件實現(xiàn)拖拽布局內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vuejs實現(xiàn)本地數(shù)據(jù)的篩選分頁功能思路詳解
今天做項目需要一份根據(jù)本地數(shù)據(jù)的篩選分頁功能,下面小編把vuejs實現(xiàn)本地數(shù)據(jù)的篩選分頁功能的實現(xiàn)思路分享到腳本之家平臺,需要的朋友可以參考下2017-11-11

