首页IT科技sortable el-table(sortablejs的使用实践)

sortable el-table(sortablejs的使用实践)

时间2025-05-02 18:55:42分类IT科技浏览3133
导读:sortablejs 是一个强大的JavaScript拖拽库。...

sortablejs 是一个强大的JavaScript拖拽库           。

说明

在Angular项目中使用sortablejs拖拽库时           ,我们需要同时使用 ngx-sortablejs 这个二次封装的Angular拖拽库                 ,它封装了 sortablejs 指令     ,并支持以下参数:

@Directive({ selector: "[sortablejs]", }) export class SortablejsDirective { // 拖拽列表的数据项 @Input() sortablejs: SortableData; // array or a FormArray // 指定拖拽的容器 @Input() sortablejsContainer: string; // 拖拽相关的配置项 @Input() sortablejsOptions: Options; @Input() sortablejsCloneFunction: (item: any) => any; // 在一个拖拽实例被创建并初始化好之后        ,会立即emit出这个拖拽实例               。 @Output() sortablejsInit = new EventEmitter<Sortable>() }

基本使用

1. 素颜版

<div class="container" [sortablejs]="items" [sortablejsOptions]="draggableOptions" > <div *ngFor="let item of items" class="item"> {{ item.name }} </div> </div> import { SortableOptions } from sortablejs; draggableOptions: SortableOptions = {};

2. 设置可被拖起的项的样式

<div class="container" [sortablejs]="items" [sortablejsOptions]="draggableOptions" > <ng-container *ngFor="let item of items"> <div *ngIf="item.id !== 002" class="item sortable-item"> {{ item.name }} </div> <div *ngIf="item.id === 002" class="item"> {{ item.name }}                  ,这个项不可被拖起 </div> </ng-container> </div> draggableOptions: SortableOptions = { // 允许拖拽的项的类名       ,只有这个类名的项才可以拖起 draggable: .sortable-item, }; .sortable-item { background-color: antiquewhite; }

3. 设置被选中的项的样式

draggableOptions: SortableOptions = { // 拖拽项被选中时的类名 chosenClass: sortable-chosen, }; .sortable-chosen { background-color: lightblue; }

4. 设置拖拽时跟随的阴影的样式

draggableOptions: SortableOptions = { // 项被拖拽的过程中跟随它的那个影子的类名 ghostClass: sortable-ghost, }; .sortable-ghost { background-color: lightgray; }

5. 设置正在被拖拽中的样式

draggableOptions: SortableOptions = { dragClass: sortable-drag, }; .sortable-drag { background-color: orange; border-bottom: none; }

6. 设置当前列表容器内是否可以进行拖拽排序

draggableOptions2: SortableOptions = { sort: false, // 值为false     ,组内不可拖拽排序 group: { name: china, pull: true, // 组内的项可以被拖出去到其它组 } };

7. 设置拖拽的手柄

<div class="container" [sortablejs]="items" [sortablejsOptions]="draggableOptions" > <div *ngFor="let item of items" class="item sortable-item"> <div class="sortable-handle">手柄</div> {{ item.name }} </div> </div> draggableOptions: SortableOptions = { // draggable: .sortable-item, // 可拖拽项的手柄的类名                  ,只有按住手柄才能拖起      。(如果将上面那行注释放开          ,那就不只有手柄能拖拽了) handle: .sortable-handle, };

8. 多个列表之间的拖拽 [group]

示例1 [name]

配置项的group属性里的name相同的两个拖拽组之间的项可以互相拖拽         。

// 甲组 draggableOptions1: SortableOptions = { group: { name: wmm, } }; // 乙组 draggableOptions2: SortableOptions = { group: { name: wmm, } };

示例2 [put]

多个拖拽组  ,name不同时                 ,可以通过 put 指定其它组只有满足条件的项可以拖进当前列表               。

// 甲组 draggableOptions1: SortableOptions = { group: { name: wmm, } }; // 乙组 draggableOptions2: SortableOptions = { group: { name: china, } }; // 丙组 draggableOptions3: SortableOptions = { group: { name: happy, /** * put字段的值可以指定为以下四种: * true: 可以将其它指定组的项拖进本组 * false: 其它任何组的项都不能拖到本组 * [wmm, china]: 只能将甲组和乙组的项拖到本组         。[china]: 只能将乙组的项拖到本组      。 * function: 自定义函数             ,可进行复杂逻辑判断,根据返回true或false              ,来判断当前被拖拽的项是否能往本组里放               。 */ put: [china], // 指定甲组和乙组的项可以往丙组里面放 } };

示例3 [put function]

多个拖拽组                ,可以通过指定 put 的值为function  ,在function里进行复杂判断来确定被拖拽的项是否可以被拖进本组            。

<div class="container2" [sortablejs]="items2" [sortablejsOptions]="draggableOptions2" > 乙组 <div *ngFor="let item of items2" class="item sortable-item2" [ngClass]="{ can-move-to-happy: item.name.indexOf(乙 5) === -1 }" > {{ item.name }} {{ item.name.indexOf("乙 5") !== -1 ? "--该项不可用被拖进丙组" : "" }} </div> </div> // 乙组 draggableOptions2: SortableOptions = { group: { name: china, } }; // 丙组 draggableOptions3: SortableOptions = { group: { name: happy, /** * put的值可以是一个自定义function           ,可进行复杂逻辑判断   。 * 根据返回true或false                 ,来判断当前被拖拽的项是否能往本组里放               。 */ put: ( to: Sortable, from: Sortable, dragEl: HTMLElement, event: SortableEvent ) => { // 判断:只有带有样式类名为can-move-to-happy的项    ,才能被拖进本组              。 return dragEl?.classList.contains(can-move-to-happy); }, } };

示例4 [pull]

draggableOptions2: SortableOptions = { group: { name: china, /** * 从一个列表中拖动到另一个列表时        ,是否允许拖动。 默认值:true             。 * true:允许拖动 * false:不允许拖动 * clone:克隆一个副本拖到其它组 * function:自定义函数                  ,可进行复杂逻辑判断       ,根据返回true或false     ,来判断被拖拽的项是否可从本组移出去                。 */ pull: ( to: Sortable, from: Sortable, dragEl: HTMLElement, event: SortableEvent ) => { return !dragEl?.classList.contains(can-move-to-happy); }, }, };

此示例就不截图了   。

9. 多个拖拽组嵌套

<div class="grandpa-container" [sortablejs]="treeItems" [sortablejsOptions]="draggableOptions" > <div *ngFor="let grandpa of treeItems" class="item" [id]="grandpa.id" [ngClass]="{ a: grandpa.name.indexOf(甲) !== -1, b: grandpa.name.indexOf(乙) !== -1, c: grandpa.name.indexOf(丙) !== -1 }" > {{ grandpa?.name }} <ng-container *ngIf="grandpa?.children?.length"> <div class="father-container" [id]="grandpa.id" [sortablejs]="grandpa?.children" [sortablejsOptions]="draggableOptions" > <div *ngFor="let father of grandpa?.children" class="item" [id]="father.id" [ngClass]="{ a: father.name.indexOf(甲) !== -1, b: father.name.indexOf(乙) !== -1, c: father.name.indexOf(丙) !== -1 }" > {{ father?.name }} <ng-container *ngIf="father?.children?.length"> <div class="son-container" [id]="father.id" [sortablejs]="father?.children" [sortablejsOptions]="draggableOptions" > <div *ngFor="let son of father?.children" class="item" [id]="son.id" [ngClass]="{ a: son.name.indexOf(甲) !== -1, b: son.name.indexOf(乙) !== -1, c: son.name.indexOf(丙) !== -1 }" > {{ son?.name }} </div> </div> </ng-container> </div> </div> </ng-container> </div> </div> public draggableOptions: SortableOptions = { group: { name: wmm, } // 元素 从其它拖拽分组 拖进 本拖拽分组 时触发 onAdd: (event: SortableEvent) => { console.log(onAdd event:, event); console.log(自身id:, event.item.id); console.log(当前所属父id:, event.to.id); console.log(在当前分组中的index:, event.newIndex); }, // 元素在本拖拽分组中的位置发生改变时触发 onUpdate: (event: SortableEvent) => { console.log(onUpdate event:, event); }, }; public treeItems: { id: string; name: string; children?: any[] = []; } = []; ngOnInit(): void { // 初始化 treeItems for (let i = 0; i < 5; i++) { let grandpa: any = { id: `0${i}`, name: `甲 0${i}`, children: [] }; if (i === 1) { let fathers: any = []; for (let j = 0; j < 5; j++) { const fatherItem: any = { id: `00${j}`, name: `乙 00${j}`, }; if (j === 4) { let sons: any = []; for (let k = 0; k < 5; k++) { const sonItem = { id: `000${k}`, name: `丙 000${k}`, }; sons.push(sonItem); } fatherItem.children = sons; } fathers.push(fatherItem); } grandpa.children = fathers; } this.treeItems.push(grandpa); } }

第一次拖拽:

第二次拖拽:

学习来源

更多配置项及回调方法: http://www.sortablejs.com/options.html

更多示例: http://sortablejs.github.io/Sortable/

Sortable仓库: https://github.com/SortableJS/Sortable

ngx-sortablejs仓库 https://github.com/sortablejs/ngx-sortablejs#readme
声明:本站所有文章                  ,如无特殊说明或标注          ,均为本站原创发布           。任何个人或组织  ,在未征得本站同意时                 ,禁止复制           、盗用                 、采集    、发布本站内容到任何网站        、书籍等各类媒体平台               。如若本站内容侵犯了原著者的合法权益             ,可联系我们进行处理      。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
判断一个对象是否为null(前端基础面试题:如何判断对象是否具有某属性?遍历数组的方法有哪些?) 泛型作为参数(【实战】用 Custom Hook + TS泛型实现 useArray)