vue-grid-layout
一個可以拖拽的 vue 布局方案
https://www.cnblogs.com/yasoPeng/p/9961732.html // 位址
下載下傳
install with npm
npm install vue-grid-layout --save
install with yarn
yarn add vue-grid-layout
引入
import VueGridLayout from ‘vue-grid-layout’; // vue 項目中
// 普通項目中
代碼片段
<grid-layout
// 作用 資料類型 必填 備注
//===================================================
// 網格初始化布局 數組 必填 每一項都必須具有i、x、y、w和h屬性 屬性用作什麼 見下方
:layout.sync=“layout”
// 表示網格有多少列 數字 非必填 預設為12
:col-num=“12”
// 表示一行的高度(以像素為機關) 數字 非必填 預設值為150
:row-height=“30”
// 表示網格中最大行數 數字 非必填 預設為無窮大
:maxRows=“20”
// 表示網格項數是否可以拖動 Boolean 非必填 預設為true
:is-draggable=“true”
// 表示網格是否可以改變帶大小 Boolean 非必填 預設為true
:is-resizable=“true”
// RTL/LTR 的轉換 Boolean 非必填 預設為false
:is-mirrored=“false”
// 容器是否适應内部變化 Boolean 非必填 預設為 true
:autoSize=“ture”
// 垂直方向上 是否應該緊湊布局 Boolean 非必填 預設為true
:vertical-compact=“true”
// 網格之間的邊距 兩個數字組成的數組 第一個數字為水品距離 第二個為垂直距離 非必填 預設值為 [10,10]
:margin="[10, 10]"
// 是否使用css的transforms來排版 非必填 為false時 使用後采用定位方式來布局 預設為true
:use-css-transforms=“true”
// 布局是否應響應視窗寬度 非必填 預設false 為true時 會出現一些布局錯亂的問題
:responsive=“false”
//布局是否應響應為響應布局定義的視窗寬度斷點 對象類型 非必填 預設值
// { lg: 1200, md: 996, sm: 768, xs: 480, xxs: 0 }
:breakpoints=" { lg: 1200, md: 996, sm: 768, xs: 480, xxs: 0 }"
// 定義每個斷點的列數
:cols="{ lg: 12, md: 10, sm: 6, xs: 4, xxs: 2 }"
// 生命周期
@layout-created=“layoutCreatedEvent” // 布局建立事件
@layout-before-mount=“layoutBeforeMountEvent” // 布局安裝以前事件
@layout-mounted=“layoutMountedEvent” // 布局安裝事件
@layout-ready=“layoutReadyEvent” // 布局準備活動
@layout-updated=“layoutUpdatedEvent” // 格子位置 大小更新
>
// 每個單獨控制 需要注意的是 每一個屬性都要在data中注冊一下 不然會導緻不能拖拽 或者 不能放大縮小
<grid-item
class=“echarts_box”
:x=“layoutData[0].x” // 橫向距離
:y=“layoutData[0].y” // 縱向距離
:w=“layoutData[0].w” // 寬度
:h=“layoutData[0].h” // 高度
:i=“layoutData[0].i” // 唯一值 (重複時設定會導緻一塊放大或縮小)string類型
@resize=“resizeEvent” // 當該元素 被放大縮小觸發的事件
@move=“moveEvent” // 該元素移動時 觸發的事件
@resized=“resizedEvent” // 放大縮小結束 觸發事件 注意:必須當大小相對上一次發生改變結束時才會觸發
@moved=“movedEvent” // 移動結束觸發 注意:隻有當位置相對上一次發生改變才會觸發
>
// for循環 便利數組中的内容 渲染元素
// <grid-item v-for=“item in layout”
// :x=“item.x”
// :y=“item.y”
// :w=“item.w”
// :h=“item.h”
// :i=“item.i”>
// {{item.i}}
//
import VueGridLayout from ‘vue-grid-layout’ //檔案引入
const matedata = [
{
i: “0”, // 索引值 必填
h: 4, // 高度 必填
w: 7, // 寬度 必填
x: 2, // x 軸距離 必填
y: 0, // y軸距離 必填
minW:5 // 最小寬度 當 w的值小于minW時 采用minW的值
minH:3 // 同上
maxW:8 // 的最大寬度。如果w大于maxW,那麼w将被設定為maxW。
maxH:6 // 同上
isDraggable:true // 單獨控制這一個盒子是否可以拖動 未填寫 繼承父元素的 非必填
isResizable:true // 單獨控制這一個盒子是否可以調整大小 未填寫 繼承父元素的 非必填
static:false // 這個盒子是靜态的 不能被其他元素改變位置 會被覆寫在底部
dragIgnoreFrom: ‘’ // 屬性這值為css 選擇器 項的哪些元素不應觸發項的拖動事件// 具體不知道幹嘛的 沒有用到
dragAllowFrom:’’ // 屬性這值為css 選擇器 項的哪些元素應觸發項的拖動事件 // 文檔這樣寫的
resizeIgnoreFrom:’’//屬性這值為css 選擇器 表示項的哪些元素不應觸發項的調整大小事件。//來自文檔翻譯
},
{
h: 1,
i: “1”,
w: 1,
x: 0,
y: 1
},
{
h: 1,
i: “2”,
w: 1,
x: 0,
y: 2
},
{
h: 1,
i: “3”,
w: 1,
x: 0,
y: 3
}
];
export default {
data() {
return {
layoutData: matedata, // 存放布局資料 資料格式如上
};
},
components: {
GridLayout, //注冊元件
GridItem // 注冊
},
methods: {
// 布局中單元改變事件 i, newX, newY 移動的坐标
// i, newH, newW, newHPx, newWPx 變化的大小
//newHPx, newWPx 是實際的像素
// newH, newW 是資料中的 以每個機關大小為基準點算
resizeEvent(i, newH, newW, newHPx, newWPx) {
console.log(“大小正在改變”,i, newH, newW, newHPx, newWPx);
},
moveEvent( i, newX, newY) {
console.log(“正在移動”,i, newX, newY);
},
resizedEvent(i, newH, newW, newHPx, newWPx) {
console.log(“大小改變完了”,i, newH, newW, newHPx, newWPx);
},
movedEvent( i, newX, newY) {
console.log(“移動結束了”, i, newX, newY);
},
// 布局元件的生命周期 參數newLayout=> 布局的資料 每個布局資料
layoutCreatedEvent(newLayout) {
console.log(“1Created”);
},
layoutBeforeMountEvent(newLayout) {
console.log(“2Mount”);
},
layoutMountedEvent(newLayout) {
console.log(“3Mounted”);
},
layoutReadyEvent(newLayout) {
console.log(“4Ready”);
},
layoutUpdatedEvent(newLayout) {
console.log(“Updated”);
}
},
created() {
},
mounted() {
};
};