1.0.3 • Published 1 year ago

vue3-grid-layout-picker v1.0.3

Weekly downloads
-
License
MIT
Repository
-
Last release
1 year ago

🎄 vue3-grid-layout

npm.io npm.io npm.io npm.io

一个基于vue3+grid布局的网格拖拽布局,支持网格吸附、碰撞检测等。

⭐️ 功能一览

  • 可拖拽
  • 可调整大小
  • 网格吸附
  • 碰撞检测
  • 兼容移动端(采用 pointer 事件编写,兼容移动端)

📦 安装

# 使用 npm
npm install vue3-grid-layout --save

# 使用 yarn
yarn add vue3-grid-layout -D

# 使用 pnpm
pnpm add vue3-grid-layout -D

💡 用法

引入

// main.ts
import { createApp } from 'vue'
import './style.css'
import App from './App.vue'
import Vue3GrifLayout from 'vue3-grid-layout-picker'
import "vue3-grid-layout-drop/dist/style.css" // 引入组件样式
createApp(App).use(Vue3GrifLayout).mount('#app')

组件中使用

<template>
  <div class="layout-box">
        <grid-layout
            v-model:data="layout"
            @draggableStart="draggableStart"
            @draggableHandle="draggableHandle"
            @draggableEnd="draggableEnd"
            @remove="remove"
        >
          <grid-item v-for="item in layout" :key="item.id" :id="item.id">
              {{ item.id }}
          </grid-item>
      </grid-layout>
      <button @click="layout = []">改变</button>
  </div>
</template>

<script setup lang="ts">
import { Layout, LayoutItem } from 'vue3-grid-layout-drop/dist/Vue3GridLayout/types/index'
import { ref, watch } from 'vue';

const layout = ref([
  { id: '1', x: 1, y: 1, h: 1, w: 1 },
  { id: '2', x: 2, y: 1, h: 1, w: 1 },
  { id: '3', x: 3, y: 1, h: 1, w: 1 },
  { id: '4', x: 4, y: 1, h: 1, w: 1 },
  { id: '5', x: 1, y: 2, h: 1, w: 1 },
  { id: '6', x: 1, y: 3, h: 1, w: 1 },
  { id: '7', x: 1, y: 4, h: 1, w: 1 },
  { id: '8', x: 1, y: 5, h: 4, w: 1 },
  { id: '9', x: 2, y: 2, h: 1, w: 1 },
  { id: '10', x: 2, y: 3, h: 1, w: 1 },
  { id: '11', x: 2, y: 4, h: 1, w: 1 },
  { id: '12', x: 5, y: 5, h: 1, w: 2 },
])
// 验证更新数据是否正确
watch(layout, () => {
  console.log('数据更新', layout.value)
}, {deep: true})

const draggableStart = (id: string) => {
  console.log('拖拽开始', id)
}
const draggableHandle = (id: string, data: LayoutItem) => {
  console.log('拖拽中', id, data)
}
const draggableEnd = (data: Layout) => {
  console.log('拖拽结束', data)
}
const remove = (id: string) => {
  console.log('删除', id)
}
</script>
<style>
.layout-box {
  width: 1000px;
}
</style>

这里需要注意的一点是,在组件的外层或者组件本身需要指定宽度,不然宽度会计算为0

🎁 Apis

🔩 Props

GridLayout

interface LayoutItem {
    id: string,
    x: number,
    y: number,
    h: number,
    w: number
}
type Layout = LayoutItem[]
名称类型默认值说明
dataLayout[]布局数据,支持双向绑定v-model:data="layoutData"
colnumber12列数
rowHnumber50行高
gutternumber10网格间距
dragebooleantrue是否可拖拽
resizebooleantrue是否可缩放
removebooleantrue是否可删除
isDrawGridLinesbooleantrue是否绘制网格线

GridItem

名称类型默认值说明
idstring | 方块的唯一标识

🎍 插槽

名称说明
default自定义每个方块的内容
resize自定义缩放的图标
remove自定义删除图标

🪢 事件

名称说明回调参数
draggableStart拖拽开始时触发拖拽的方块的id
draggableHandle拖拽中触发拖拽方块的id、拖拽方块的数据
draggableEnd拖拽结束时触发拖拽结束后的布局数据
remove删除方块时触发删除的方块的id
1.0.3

1 year ago

1.0.2

1 year ago

1.0.1

1 year ago

1.0.0

1 year ago