django-vue3-admin-web/node_modules/vue-grid-layout/README-zh_CN.md
2025-10-20 21:21:14 +08:00

593 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<h1 align="center">vue-grid-layout</h1>
<p align="center">
<a href="https://www.npmjs.com/package/vue-grid-layout"><img src="https://img.shields.io/npm/v/vue-grid-layout.svg"/> <img src="https://img.shields.io/npm/dm/vue-grid-layout.svg"/></a> <a href="https://vuejs.org/"><img src="https://img.shields.io/badge/vue-2.2.x-brightgreen.svg"/></a>
</p>
vue-grid-layout是一个类似于[Gridster](http://dsmorse.github.io/gridster.js/)的栅格布局系统, 适用于Vue.js。 **灵感源自于 [React-Grid-Layout](https://github.com/STRML/react-grid-layout)**
### **当前版本:** 2.3.11 (支持 Vue 2.2+)
### **Vue 2.1.10 及以下请使用 [2.1.3](https://github.com/jbaysolutions/vue-grid-layout/tree/2.1.3)**
### **Vue 1 请使用 [1.0.3](https://github.com/jbaysolutions/vue-grid-layout/tree/1.0.3)**
<br/>
[**[在线演示](https://jbaysolutions.github.io/vue-grid-layout/examples/01-basic.html) | [更新日志](/CHANGELOG.md)**]
[English](./README.md) | 简体中文
<!--
## Table of Contents
- [特性](#%e7%89%b9%e6%80%a7)
- [入门指南](#%e5%85%a5%e9%97%a8%e6%8c%87%e5%8d%97)
- [安装](#%e5%ae%89%e8%a3%85)
- [npm](#npm)
- [如何贡献](#%e5%a6%82%e4%bd%95%e8%b4%a1%e7%8c%ae)
- [待办事项](#%e5%be%85%e5%8a%9e%e4%ba%8b%e9%a1%b9)
## Demos
TODO UPDATE DOCS
Used guide for vue cli build: https://medium.com/justfrontendthings/how-to-create-and-publish-your-own-vuejs-component-library-on-npm-using-vue-cli-28e60943eed3
Also check https://cli.vuejs.org/guide/build-targets.html#library
-->
#### 成功案例
- [Draxed](https://www.draxed.com/?utm_source=github&utm_medium=web&utm_campaign=vue-grid-layout)
- [cryptotiles](https://www.cryptotiles.io/?utm_source=github&utm_medium=web&utm_campaign=vue-grid-layout)
- [Data Providers](https://www.dataproviders.io/?utm_source=github&utm_medium=web&utm_campaign=vue-grid-layout)
- [Cataholic](https://cataholic.glitch.me/)
*您还知悉其他项目? 请创建一个PR谢谢!*
## 特性
* 可拖拽
* 可调整大小
* 静态部件(不可拖拽、调整大小)
* 拖拽和调整大小时进行边界检查
* 增减部件时避免重建栅格
* 可序列化和还原的布局
* 自动化 RTL 支持
* 响应式
## 入门指南
### 安装
#### npm
# 使用 npm
npm install vue-grid-layout --save
# 使用 yarn
yarn add vue-grid-layout
引入
```javascript
import VueGridLayout from 'vue-grid-layout';
```
加入到 Vue 组件
```javascript
export default {
components: {
GridLayout: VueGridLayout.GridLayout,
GridItem: VueGridLayout.GridItem
},
// ... data, methods, mounted (), etc.
}
```
#### 浏览器
在页面中使用已打包好的 [文件](https://github.com/jbaysolutions/vue-grid-layout/releases)。 此时组件已为可用状态。
```html
<script src="vue-grid-layout.umd.min.js"></script>
```
### 使用
```javascript
var testLayout = [
{"x":0,"y":0,"w":2,"h":2,"i":"0"},
{"x":2,"y":0,"w":2,"h":4,"i":"1"},
{"x":4,"y":0,"w":2,"h":5,"i":"2"},
{"x":6,"y":0,"w":2,"h":3,"i":"3"},
{"x":8,"y":0,"w":2,"h":3,"i":"4"},
{"x":10,"y":0,"w":2,"h":3,"i":"5"},
{"x":0,"y":5,"w":2,"h":5,"i":"6"},
{"x":2,"y":5,"w":2,"h":5,"i":"7"},
{"x":4,"y":5,"w":2,"h":5,"i":"8"},
{"x":6,"y":3,"w":2,"h":4,"i":"9"},
{"x":8,"y":4,"w":2,"h":4,"i":"10"},
{"x":10,"y":4,"w":2,"h":4,"i":"11"},
{"x":0,"y":10,"w":2,"h":5,"i":"12"},
{"x":2,"y":10,"w":2,"h":5,"i":"13"},
{"x":4,"y":8,"w":2,"h":4,"i":"14"},
{"x":6,"y":8,"w":2,"h":4,"i":"15"},
{"x":8,"y":10,"w":2,"h":5,"i":"16"},
{"x":10,"y":4,"w":2,"h":2,"i":"17"},
{"x":0,"y":9,"w":2,"h":3,"i":"18"},
{"x":2,"y":6,"w":2,"h":2,"i":"19"}
];
new Vue({
el: '#app',
data: {
layout: testLayout,
},
});
```
```html
<grid-layout
:layout.sync="layout"
:col-num="12"
:row-height="30"
:is-draggable="true"
:is-resizable="true"
:is-mirrored="false"
: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">
{{item.i}}
</grid-item>
</grid-layout>
```
### 文档
#### 属性
##### GridLayout
* **layout**
* type: `Array`
* required: `true`
数据源。值必须为 `Array`,其数据项为 `Object`。 每条数据项必须有 `i`, `x`, `y`, `w``h` 属性。 请参考下面的 `GridItem`
* **responsiveLayouts**
* type: `Object`
* required: `false`
* default: `{}`
如果 `responsive` 设置为 `true`,该配置将作为栅格中每个断点的初始布局。键值是断点名称,每项的值都是类似 `layout` 属性定义的数据结构,值必须为 `Array`,其数据项为 `Object`。例如: `{lg: [layout items], md: [layout items]}`。需要注意的是,在创建栅格布局后设置该属性无效。
* **colNum**
* type: `Number`
* required: `false`
* default: `12`
定义栅格系统的列数,其值需为自然数。
* **rowHeight**
* type: `Number`
* required: `false`
* default: `150`
每行的高度,单位像素。
* **maxRows**
* type: `Number`
* required: `false`
* default: `Infinity`
定义最大行数。
* **margin**
* type: `Array`
* required: `false`
* default: `[10, 10]`
定义栅格中的元素边距。
值必须是包含两个 `Number`的数组,数组中第一个元素表示水平边距,第二个表示垂直边距,单位为像素。
* **isDraggable**
* type: `Boolean`
* required: `false`
* default: `true`
标识栅格中的元素是否可拖拽。
* **isResizable**
* type: `Boolean`
* required: `false`
* default: `true`
标识栅格中的元素是否可调整大小。
* **isMirrored**
* type: `Boolean`
* required: `false`
* default: `false`
标识栅格中的元素是否可镜像反转。
* **autoSize**
* type: `Boolean`
* required: `false`
* default: `true`
标识容器是否自动调整大小。
* **verticalCompact**
* type: `Boolean`
* required: `false`
* default: `true`
标识布局是否垂直压缩。
* **useCssTransforms**
* type: `Boolean`
* required: `false`
* default: `true`
标识是否使用CSS属性 `transition-property: transform;`
* **responsive**
* type: `Boolean`
* required: `false`
* default: `false`
标识布局是否为响应式。
* **breakpoints**
* type: `Object`
* required: `false`
* default: { lg: 1200, md: 996, sm: 768, xs: 480, xxs: 0 }
为响应式布局设置断点其中参数代表不同设备的宽度lglargemdmediumsmsmallxsextra small
* **cols**
* type: `Object`
* required: `false`
* default: { lg: 12, md: 10, sm: 6, xs: 4, xxs: 2 }
设置每个断点对应的列数。
* **useStyleCursor**
* type: `Boolean`
* required: `false`
* default: `true`
标识是否使用动态鼠标指针样式。当拖动出现卡顿时,将此值设为 `false`也许可以缓解布局问题。
* **preventCollision**
* type: `Boolean`
* default: `false`
值设置为ture时栅格只能拖动至空白处。
##### GridItem
* **i**
* type: `String`
* required: `true`
栅格中元素的ID。
* **x**
* type: `Number`
* required: `true`
标识栅格元素位于第几列,需为自然数。
* **y**
* type: `Number`
* required: `true`
标识栅格元素位于第几行,需为自然数。
* **w**
* type: `Number`
* required: `true`
标识栅格元素的初始宽度,值为`colWidth`的倍数。
* **h**
* type: `Number`
* required: `true`
标识栅格元素的初始高度,值为`rowHeight`的倍数。
* **minW**
* type: `Number`
* required: `false`
* default: `1`
栅格元素的最小宽度,值为`colWidth`的倍数。
如果`w`小于`minW`,则`minW`的值会被`w`覆盖。
* **minH**
* type: `Number`
* required: `false`
* default: `1`
栅格元素的最小高度,值为`rowHeight`的倍数。
如果`h`小于`minH`,则`minH`的值会被`h`覆盖。
* **maxW**
* type: `Number`
* required: `false`
* default: `Infinity`
栅格元素的最大宽度,值为`colWidth`的倍数。
如果`w`大于`maxW`,则`maxW`的值会被`w`覆盖。
* **maxH**
* type: `Number`
* required: `false`
* default: `Infinity`
栅格元素的最大高度,值为`rowHeight`的倍数。
如果`h`大于`maxH`,则`maxH`的值会被`h`覆盖。
* **isDraggable**
* type: `Boolean`
* required: `false`
* default: `null`
标识栅格元素是否可拖拽。如果值为`null`则取决于父容器。
* **isResizable**
* type: `Boolean`
* required: `false`
* default: `null`
标识栅格元素是否可调整大小。如果值为`null`则取决于父容器。
* **static**
* type: `Boolean`
* required: `false`
* default: `false`
标识栅格元素是否为静态的(无法拖拽、调整大小或被其他元素移动)。
* **dragIgnoreFrom**
* type: `String`
* required: `false`
* default: `'a, button'`
标识栅格元素中哪些子元素无法触发拖拽事件,值为`css-like`选择器。
请参考 [interact.js docs](http://interactjs.io/docs/#ignorable-selectors)中的`ignoreFrom`。
* **dragAllowFrom**
* type: `String`
* required: `false`
* default: `null`
标识栅格元素中哪些子元素可以触发拖拽事件,值为`css-like`选择器。
如果值为`null`则表示所有子元素(`dragIgnoreFrom`的除外)。
请参考 [interact.js docs](http://interactjs.io/docs/#ignorable-selectors)中的`allowFrom`。
* **resizeIgnoreFrom**
* type: `String`
* required: `false`
* default: `'a, button'`
标识栅格元素中哪些子元素无法触发调整大小的事件,值为`css-like`选择器。
请参考 [interact.js docs](http://interactjs.io/docs/#ignorable-selectors)中的`ignoreFrom`。
#### 事件
每一个栅格元素`grid-item`上都可以添加监听器用于监听移动和调整大小事件这样父级Vue对象就可以收到通知。
[示例](https://jbaysolutions.github.io/vue-grid-layout/examples/02-events.html)
````html
<grid-layout
:layout="layout"
:col-num="12"
:row-height="30"
:is-draggable="true"
:is-resizable="true"
:vertical-compact="true"
:margin="[10, 10]"
:use-css-transforms="true"
@layout-created="layoutCreatedEvent"
@layout-before-mount="layoutBeforeMountEvent"
@layout-mounted="layoutMountedEvent"
@layout-ready="layoutReadyEvent"
@layout-updated="layoutUpdatedEvent"
>
<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"
@resize="resizeEvent"
@move="moveEvent"
@resized="resizedEvent"
@moved="movedEvent">
{{item.i}}
</grid-item>
</grid-layout>
````
* **layoutCreatedEvent**
对应Vue生命周期的`created`
```javascript
layoutCreatedEvent: function(newLayout){
console.log("Created layout: ", newLayout)
}
```
* **layoutBeforeMountEvent**
对应Vue生命周期的`beforeMount`
```javascript
layoutBeforeMountEvent: function(newLayout){
console.log("beforeMount layout: ", newLayout)
}
```
* **layoutMountedEvent**
对应Vue生命周期的`mounted`
```javascript
layoutMountedEvent: function(newLayout){
console.log("Mounted layout: ", newLayout)
}
```
* **layoutReadyEvent**
当完成mount中的所有操作时生成的事件
```javascript
layoutReadyEvent: function(newLayout){
console.log("Ready layout: ", newLayout)
}
```
* **layoutUpdatedEvent**
更新事件(布局更新或栅格元素的位置重新计算)
```javascript
layoutUpdatedEvent: function(newLayout){
console.log("Updated layout: ", newLayout)
}
```
* **moveEvent**
移动时的事件
```javascript
moveEvent: function(i, newX, newY){
console.log("MOVE i=" + i + ", X=" + newX + ", Y=" + newY);
},
```
* **resizeEvent**
调整大小时的事件
```javascript
resizeEvent: function(i, newH, newW, newHPx, newWPx){
console.log("RESIZE i=" + i + ", H=" + newH + ", W=" + newW + ", H(px)=" + newHPx + ", W(px)=" + newWPx);
},
```
* **movedEvent**
移动后的事件
```javascript
movedEvent: function(i, newX, newY){
console.log("MOVED i=" + i + ", X=" + newX + ", Y=" + newY);
},
```
* **resizedEvent**
调整大小后的事件
```javascript
/**
*
* @param i the item id/index
* @param newH new height in grid rows
* @param newW new width in grid columns
* @param newHPx new height in pixels
* @param newWPx new width in pixels
*
*/
resizedEvent: function(i, newH, newW, newHPx, newWPx){
console.log("RESIZED i=" + i + ", H=" + newH + ", W=" + newW + ", H(px)=" + newHPx + ", W(px)=" + newWPx);
},
```
## 如何贡献
请提交issue或PR。
## 待办事项
- [x] 基础栅格布局
- [x] 响应式
- [x] 可拖拽的栅格元素
- [x] 可调整大小的栅格元素
- [x] 静态元素
- [x] 每个元素的Min/max w/h