react-grid-layout:可拖拽縮放網(wǎng)格布局插件

名稱

react-grid-layout

簡(jiǎn)介

????React-Grid-Layout 是一個(gè)網(wǎng)格布局系統(tǒng),具有響應(yīng)性并支持?jǐn)帱c(diǎn)(breakpoints)。斷點(diǎn)布局可以由用戶提供或自動(dòng)生成。

RGL 僅支持 React,不支持 jQuery。

示圖

安裝

????使用npm安裝 React-Grid-Layout:

npm install react-grid-layout

????樣式表:

/node_modules/react-grid-layout/css/styles.css

/node_modules/react-resizable/css/styles.css

基本用法

????下面的示例將生成一個(gè)包含三個(gè)項(xiàng)目的網(wǎng)格,其中:

? ? 1.????用戶將無(wú)法拖動(dòng)或調(diào)整項(xiàng)目大小 a

? ? 2.????b 將被限制為最小寬度為 2 個(gè)網(wǎng)格塊和最大寬度為 4 個(gè)網(wǎng)格塊

? ? 3.????用戶將能夠自由拖動(dòng)和調(diào)整項(xiàng)目大小 c

import GridLayout from 'react-grid-layout';

class MyFirstGrid extends React.Component {?

????render() {? ?

????????// layout is an array of objects, see the demo for more complete usage? ? const layout = [? ? ?

????????????{i: 'a', x: 0, y: 0, w: 1, h: 2, static: true},? ? ?

????????????{i: 'b', x: 1, y: 0, w: 3, h: 2, minW: 2, maxW: 4},? ? ?

????????????{i: 'c', x: 4, y: 0, w: 1, h: 2}? ?

????????];? ?

????????return (? ? ?

????????????<GridLayout className="layout" layout={layout} cols={12} rowHeight={30} width={1200}>? ? ? ?

????????????????<div key="a">a</div>? ? ? ?

????????????????<div key="b">b</div>? ? ? ?

????????????????<div key="c">c</div>? ? ?

????????????</GridLayout>? ?

????????)?

????}

}

可以選擇直接在子項(xiàng)上設(shè)置布局屬性:

import GridLayout from 'react-grid-layout';

class MyFirstGrid extends React.Component {?

????render() {? ?

????????return (? ? ?

????????????<GridLayout className="layout" cols={12} rowHeight={30} width={1200}>?

????????????????<div key="a" data-grid={{x: 0, y: 0, w: 1, h: 2, static: true}}>a</div>

????????????????<div key="b" data-grid={{x: 1, y: 0, w: 3, h: 2, minW: 2, maxW: 4}}>b</div>

????????????????<div key="c" data-grid={{x: 4, y: 0, w: 1, h: 2}}>c</div>? ? ?

????????????</GridLayout>? ?

????????)

????}

}

響應(yīng)式用法

import { Responsive as ResponsiveGridLayout }

from 'react-grid-layout';

class MyResponsiveGrid extends React.Component {?

????render() {

????????// {lg: layout1, md: layout2, ...}? ?

????????const layouts = getLayoutsFromSomewhere();? ?

????????return (

????????????<ResponsiveGridLayout className="layout" layouts={layouts} breakpoints={{lg: 1200, md: 996, sm: 768, xs: 480, xxs: 0}} cols={{lg: 12, md: 10, sm: 6, xs: 4, xxs: 2}}>

????????????????<div key="1">1</div>

????????????????<div key="2">2</div>

????????????????<div key="3">3</div>

????????????</ResponsiveGridLayout>

????????)?

????}

}

計(jì)算網(wǎng)格寬度

????<ResponsiveReactGridLayout>和<ReactGridLayout>采取width來(lái)計(jì)算拖動(dòng)事件位置。在簡(jiǎn)單的情況下,WidthProvider可以使用HOC在初始化和窗口調(diào)整大小事件時(shí)自動(dòng)確定寬度。

import { Responsive, WidthProvider } from 'react-grid-layout';

const ResponsiveGridLayout = WidthProvider(Responsive);

class MyResponsiveGrid extends React.Component {?

????render() {? ?

????????// {lg: layout1, md: layout2, ...}? ?

????????var layouts = getLayoutsFromSomewhere();? ?

????????return (? ? ?

????????????<ResponsiveGridLayout className="layout" layouts={layouts}? breakpoints={{lg: 1200, md: 996, sm: 768, xs: 480, xxs: 0}} cols={{lg: 12, md: 10, sm: 6, xs: 4, xxs: 2}}>? ? ? ?

????????????????<div key="1">1</div>? ? ? ?

????????????????<div key="2">2</div>? ? ? ?

????????????????<div key="3">3</div>? ? ?

????????????</ResponsiveGridLayout>? ?

????????)?

????}

}

Grid Layout Props

????// 除使用 <WidthProvider>情況外必填

? ??width: number,

????// 如果為 true,容器高度自適應(yīng)內(nèi)容

? ??autoSize: ?boolean = true,

????//布局中的列數(shù)。

? ??cols: ?number = 12,

????// 取消拖拽時(shí)的css選擇器

? ??draggableCancel: ?string = '',

????// 拖拽時(shí)的css選擇器

? ??draggableHandle: ?string = '',

????// 緊湊排列類型

? ??compactType: ?('vertical' | 'horizontal') = 'vertical';

????// 布局,格式為數(shù)組對(duì)象,例如:

????// {x: number, y: number, w: number, h: number}

????// 布局中的索引必須與每個(gè)項(xiàng)目組件上使用的鍵匹配。

????// 如果您選擇使用自定義鍵,則可以在布局中指定該鍵

????// 數(shù)組對(duì)象,如下所示:

????// {i: string, x: number, y: number, w: number, h: number}

????//如果父組件沒(méi)有設(shè)置layout,則需要在子組件設(shè)置 data-grid

? ??layout: ?array = null,

????//? [x, y] 的margin值

? ??margin: ?[number, number] = [10, 10],

????//? [x, y] 的padding值

? ??containerPadding: ?[number, number] = margin,

????// 行高,可根據(jù) breakpoints 改變

? ??rowHeight: ?number = 150,

????// 放置元素的配置。放置元素是一個(gè)從外部拖動(dòng)某個(gè)元素時(shí)會(huì)出現(xiàn)的虛擬元素。

????//? i - 元素的id

????//? w - 元素的寬

????//? h - 元素的高

? ??droppingItem?: { i: string, w: number, h: number }

????// 是否可拖拽

? ??isDraggable: ?boolean = true,

????//是否可重置大小

? ??isResizable: ?boolean = true,

????//是否可設(shè)置邊界

? ??isBounded: ?boolean = false,

????// 使用 CSS3 translate() 替換position 的top/left ,可提升大約6倍性能

? ??useCSSTransforms: ?boolean = true,

????//如果 ResponsiveReactGridLayout 或 ReactGridLayout 的父節(jié)點(diǎn)具有 "transform: scale(n)" 屬性,應(yīng)該設(shè)置縮放系數(shù)以避免拖動(dòng)時(shí)出現(xiàn)渲染偽影。

? ??transformScale: ?number = 1,

????//是否允許重疊

? ??allowOverlap: ?boolean = false,

????//如果為 true,則網(wǎng)格項(xiàng)在被拖動(dòng)時(shí)不會(huì)改變位置

? ??preventCollision: ?boolean = false,

????// 如果為true, 帶有`draggable={true}`屬性的放置元素可被放置在網(wǎng)格上

????//注意:如果使用 Firefox,應(yīng)該添加

????// `onDragStart={e => e.dataTransfer.setData('text/plain', ' ')}` 屬性

????// 連同 `draggable={true}` 否則此功能將無(wú)法正常工作。

????// Firefox 需要 onDragStart 屬性來(lái)進(jìn)行拖動(dòng)初始化

????// https://bugzilla.mozilla.org/show_bug.cgi?id=568313

? ??isDroppable: ?boolean = false,

????// 重置大小時(shí)的操作位置,默認(rèn)右下

????// 可選值:

????// 's' - South handle (bottom-center)

????// 'w' - West handle (left-center)

????// 'e' - East handle (right-center)

????// 'n' - North handle (top-center)

????// 'sw' - Southwest handle (bottom-left)

????// 'nw' - Northwest handle (top-left)

????// 'se' - Southeast handle (bottom-right)

????// 'ne' - Northeast handle (top-right)

? ??resizeHandles: ?Array<'s' | 'w' | 'e' | 'n' | 'sw' | 'nw' | 'se' | 'ne'> = ['se'],

????// 自定義重置大小圖標(biāo)

? ? ?resizeHandle?: ReactElement<any> | ((resizeHandleAxis: ResizeHandleAxis, ref: ReactRef<HTMLElement>) => ReactElement<any>),

????// 布局變化回調(diào)

? ??onLayoutChange: (layout: Layout) => void,

????// 下面的所有回調(diào)都有簽名(layout、oldItem、newItem、placeholder、e、element)。

????// 'start' 和 'stop' 回調(diào)為 'placeholder' 傳遞 `undefined`。

? ? ?type ItemCallback = (layout: Layout, oldItem: LayoutItem, newItem: LayoutItem, placeholder: LayoutItem, e: MouseEvent, element: HTMLElement) => void,

????// 拖拽開(kāi)始回調(diào)

? ??onDragStart: ItemCallback,

????// 拖拽中回調(diào)

? ??onDrag: ItemCallback,

????// 拖拽停止回調(diào)

? ??onDragStop: ItemCallback,

????// 開(kāi)始重置大小回調(diào)

? ??onResizeStart: ItemCallback,

????// 重置大小中的回調(diào)

? ??onResize: ItemCallback,

????// 重置大小結(jié)束回調(diào)

? ??onResizeStop: ItemCallback,

????// 當(dāng)元素從外部放入網(wǎng)格時(shí)的回調(diào)。

? ??onDrop: (layout: Layout, item: ?LayoutItem, e: Event) => void,

????// 當(dāng)一個(gè)元素從外面拖過(guò)網(wǎng)格時(shí)調(diào)用, 此回調(diào)應(yīng)返回一個(gè)對(duì)象以動(dòng)態(tài)更改 dropItem大小

? ??onDropDragOver: (e: DragOverEvent) => ?({|w?: number, h?: number|} | false),

????// 可以使用它來(lái)代替常規(guī) ref 和已棄用的 `ReactDOM.findDOMNode()` 函數(shù)

? ??innerRef: ?React.Ref<"div">,

Responsive Grid Layout Props

????// Breakpoint名稱是任意的,但是必須在cols 和 layouts 對(duì)象中匹配。

? ??breakpoints: ?Object = {lg: 1200, md: 996, sm: 768, xs: 480, xxs: 0},

????// 列數(shù)

? ??cols: ?Object = {lg: 12, md: 10, sm: 6, xs: 4, xxs: 2},

????//[x,y]的margin

? ??margin: [number, number] | {[breakpoint: $Keys<breakpoints>]: [number, number]},

????// [x,y]的padding

? ??containerPadding: [number, number] | {[breakpoint: $Keys<breakpoints>]: [number, number]},

????// 布局配置

? ??layouts: {[key: $Keys<breakpoints>]: Layout},

????// breakpoint發(fā)生變更時(shí)的回調(diào)

? ??onBreakpointChange: (newBreakpoint: string, newCols: number) => void,

????// 布局發(fā)生變更時(shí)的回調(diào)

? ??onLayoutChange: (currentLayout: Layout, allLayouts: {[key: $Keys<breakpoints>]: Layout}) => void,

????// 寬度改變時(shí)的回調(diào),可以根據(jù)需要修改布局。

? ??onWidthChange: (containerWidth: number, margin: [number, number], cols: number, containerPadding: [number, number]) => void;

Grid Item Props

????{?

????????// 組件id

? ??????i: string,?

????????// 以下單位為網(wǎng)格,不是px

? ??????x: number,?

? ??????y: number,?

? ??????w: number,?

? ??????h: number,?

? ??????minW: ?number = 0,?

? ??????maxW: ?number = Infinity,?

? ??????minH: ?number = 0,?

? ??????maxH: ?number = Infinity,?

????????// 如果為 true,則等于 `isDraggable: false, isResizable: false`。

? ??????static: ?boolean = false,?

????????// 如果為 false,則不可拖動(dòng)。覆蓋 `static`.?

? ??????isDraggable: ?boolean = true,?

????????// 如果為 false,則不可重置大小。覆蓋 `static`.?

? ??????isResizable: ?boolean = true, ?

????????// 默認(rèn)情況下,調(diào)整大小圖標(biāo)僅顯示在右下(東南)角。?

????????// 請(qǐng)注意,從頂部或左側(cè)調(diào)整大小通常不直觀。

? ??????resizeHandles?: ?Array<'s' | 'w' | 'e' | 'n' | 'sw' | 'nw' | 'se' | 'ne'> = ['se']?

????????//如果為 true 且可拖動(dòng),則項(xiàng)目將僅在網(wǎng)格內(nèi)移動(dòng)。

? ??????isBounded: ?boolean = false

????}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容