Sortable 拖拽排序

SKILL开发
开发 未标注权限 许可证不明确
安装这个技能

意向池优先级:单列 Sortable,拖完重写 priority 并保存 看板泳道排程:多列共享 group,跨列更新 laneId + sort 硬约束:数据同步、手柄拖拽不挡按钮、卸载 destroy

一句话选型结论

按资料字段整理

Sortable 拖拽排序是开发类的 Agent Skill,安装方式未标注,权限级别未标注,许可证不明确,有可直接复制的安装命令。技能本质是给模型读的说明书,效果取决于模型与客户端;装完先用一个小任务验证,再放进正式流程。

分类开发 安装方式未标注 权限级别未标注权限 许可证许可证不明确
累计安装 未标注 本周 未标注
GitHub 星标 未标注 仓库 未标注
下载量 未标注 技能市场下载数
权限级别 未标注权限 安装前请确认风险范围
许可证 许可证不明确 未说明

安装

未标注
在支持 Skills 的客户端里执行,装完问一句「你有哪些技能」验证
skillhub install user_f1b049da/sortable-lane-schedule
  1. 1
    确认客户端支持

    确认你的客户端支持 Skills(Claude、Codex、Cursor 等),并升级到较新的版本。

  2. 2
    拿到技能文件

    执行上面的命令安装;也可以把仓库里的 SKILL.md 手动放进客户端的 skills 目录。

  3. 3
    刷新技能列表

    重新打开客户端,或刷新技能列表,让新放进来的技能被加载。

  4. 4
    验证是否生效

    问一句「你有哪些技能」,确认列表里出现它,再拿一个小任务试跑。

技能档案

开发
字段来自技能仓库与公开索引,中文说明由本站标注
作者 / 维护方user_f1b049da仓库 未标注 · 版本 未标注
宿主客户端未标注技能可被这些客户端加载
安装方式未标注安装包 community
权限级别未标注权限安装前请确认风险范围
许可证未说明许可证不明确,商用前请自行确认条款
仓库可用性available技能仓库当前是否可访问
最近核验未标注上游最后核验时间 · 数据更新 1791621862
正文体量5.4 KBSKILL.md 原文大小,越大说明说明书写得越细

典型使用场景

3 类
按分类整理的常见用法,具体以 SKILL.md 为准
写代码与改 bug

按需求补代码、定位并修掉报错。

读仓库与生成改动

让模型读懂项目结构,再给出可落地的改动。

跑测试与排查故障

按现象排查问题,补测试用例并复跑。

选择建议

装之前先看这几条
按条目字段给出的判断,不替你决定用不用

值得选的地方

  • 有可直接复制的安装命令,不用自己翻文档找入口。

先想清楚的地方

  • 没有标注权限级别,实际能做什么要装好后确认。
  • 许可证不明确,商用或二次分发前先到仓库确认条款。
  • 没有做站内核验,内容以作者仓库为准。
  • 技能只是说明书,实际效果取决于模型与客户端,装完先用小任务试一遍。

更适合

  • 需要在开发场景里给模型补一套做法的人。
  • 愿意先读一遍 SKILL.md、确认它会让模型做什么的人。

不太适合

  • 对许可证要求很严、必须明确可商用的人。
  • 只想装完就自动变强、不打算看说明书的人。

同类对比

6 个同类
同分类里挑最接近的几条,字段以各自详情页为准
技能权限级别安装方式累计安装宿主客户端安装命令
Sortable 拖拽排序当前 未标注权限 未标注 未标注 未标注 有
技能审查员 浏览器控制 ClawHub 市场 877.9 万 OpenClaw 有
Vercel React 最佳实践 浏览器控制 GitHub 仓库 849.1 万 Codex、Claude、Cursor 有
GitHub 代码协作 联网访问 ClawHub 市场 763.3 万 OpenClaw 有
网页设计指南 联网访问 GitHub 仓库 668.6 万 Codex、Claude、Cursor 有
本体论 只读 ClawHub 市场 663.7 万 OpenClaw 有

SKILL.md 全文

5.4 KB
模型实际读到的说明书原文,来自技能仓库

Sortable Lane Schedule(拖拽排序 / 泳道排程)

用 SortableJS(本仓库常见依赖 sortablejs)实现两类交互:

  1. 意向池优先级:单列表纵向拖拽,改 priority / sort
  2. 看板泳道排程:多容器(泳道)互拖,改 laneId + 列内顺序

何时启用

  • 意向池、线索池、待办池需要「拖一下就改优先级」
  • 看板 / 阶段泳道需要跨列拖卡片排程
  • 用户点名 Sortable、拖拽排序、泳道拖拽

硬约束

  1. 数据源是真相:DOM 顺序变了必须同步到数组(splice / 重写 sort),不能只动 DOM。
  2. 拖完必落库或可撤销:onEnd 后调用保存 API,或提供 Undo;禁止静默只改本地。
  3. 句柄优先:复杂卡片用 .drag-handle,避免与按钮、链接、输入框抢事件(filter / handle)。
  4. 跨泳道用同一 group:意向池单列用独立 group 名;看板多列共享 group: 'kanban'(或等价)。
  5. 销毁防泄漏:组件 onBeforeUnmount 调用 sortable.destroy()。
  6. 触摸与无障碍:移动端可开 forceFallback(按需);关键操作保留非拖拽入口(上移/下移按钮可选)。

标准工作流

Sortable Lane Schedule
- [ ] 确认已依赖 sortablejs(及 @types/sortablejs)
- [ ] 场景分流:单列优先级 / 多列泳道
- [ ] 绑定容器 ref + Sortable.create
- [ ] onEnd:重排数组 + 写回 priority/laneId
- [ ] 持久化(API / store)+ 失败回滚
- [ ] 卸载 destroy
- [ ] 验收:拖拽、跨列、点按钮仍可用

Step 1:依赖

npm i sortablejs
npm i -D @types/sortablejs
import Sortable from 'sortablejs';

Step 2A:意向池优先级(单列表)

function bindPriorityList(el: HTMLElement, items: Ref<PoolItem[]>, save: () => Promise<void>) {
  return Sortable.create(el, {
    animation: 150,
    handle: '.drag-handle',
    draggable: '.pool-row',
    ghostClass: 'is-ghost',
    chosenClass: 'is-chosen',
    onEnd: async (evt) => {
      const { oldIndex, newIndex } = evt;
      if (oldIndex == null || newIndex == null || oldIndex === newIndex) return;
      const next = items.value.slice();
      const [moved] = next.splice(oldIndex, 1);
      next.splice(newIndex, 0, moved);
      items.value = next.map((row, i) => ({ ...row, priority: i + 1 }));
      try {
        await save();
      } catch {
        // 失败:重新拉列表回滚
      }
    },
  });
}

语义:priority 越小越靠前(或按产品约定;Skill 内保持一种并写进 README)。

Step 2B:看板泳道(多容器)

每条泳道一个容器,共享 group:

function bindLane(el: HTMLElement, laneId: string, board: Ref<LaneCard[]>, persist: () => Promise<void>) {
  return Sortable.create(el, {
    group: 'kanban-lanes',
    animation: 150,
    handle: '.drag-handle',
    draggable: '.lane-card',
    emptyInsertThreshold: 24,
    onAdd: (evt) => syncBoardFromDom(board), // 或按 evt 精确改 laneId
    onUpdate: () => syncBoardFromDom(board),
    onEnd: async () => {
      await persist();
    },
  });
}

跨列时至少更新:

  • card.laneId = targetLaneId(阶段 / 负责人泳道)
  • 目标列内 sort / order 重排
  • 源列剩余项 order 重排

Step 3:从事件精确改数据(推荐)

避免「读 DOM 猜顺序」出错时,用索引法:

onEnd(evt) {
  const fromLane = evt.from.dataset.laneId!;
  const toLane = evt.to.dataset.laneId!;
  const oldIndex = evt.oldIndex!;
  const newIndex = evt.newIndex!;
  moveCard({ fromLane, toLane, oldIndex, newIndex });
}

moveCard 内操作同一份 board 状态,再 persist()。

Step 4:Vue 3 生命周期

let sortable: Sortable | null = null;
onMounted(() => {
  if (listRef.value) sortable = bindPriorityList(listRef.value, items, saveOrder);
});
onBeforeUnmount(() => {
  sortable?.destroy();
  sortable = null;
});

多泳道:用 Map<string, Sortable>,卸载时全部 destroy。

意向池 vs 泳道对照

维度 意向池优先级 看板泳道排程
容器数 1 N(每泳道 1 个)
group 可省略或独占名 必须相同才能互拖
写入字段 priority / sort laneId + sort
空列 少见 需 min-height + emptyInsertThreshold

反模式

禁止 原因
只 Sortable.create 不改数组 刷新后顺序丢失 / Vue 抽风
在 onMove 里打重度 API 拖拽卡顿
整卡可拖且无 filter 点不开详情/按钮
泳道 group 名不一致 无法跨列
忘记 destroy 重复绑定、幽灵拖拽

Agent 交付检查

  • [ ] 单列或/与多列场景按需求实现
  • [ ] onEnd 后数据与展示一致
  • [ ] 有保存或明确的本地持久化策略
  • [ ] 句柄/过滤不挡业务点击
  • [ ] 卸载已 destroy

附加资源

  • 选项与排错:reference.md
  • Vue 模板:templates/vue-pool-and-board.md

常见问题

5 问
答案由本站依据条目字段整理
Sortable 拖拽排序怎么安装?

在支持 Skills 的客户端里执行:skillhub install user_f1b049da/sortable-lane-schedule。安装方式为未标注。装完刷新技能列表或重开客户端。

Sortable 拖拽排序支持哪些客户端?

资料没有标注宿主客户端,但只要客户端支持 Skills(Claude、Codex、Cursor 等),一般都能加载。

Sortable 拖拽排序权限高吗,安全吗?

权限级别为未标注权限。安装前先看它会读取或写入哪些内容。

Sortable 拖拽排序收费吗?

本站不代收费用,也没有标注具体价格。是否收费取决于技能本身和所用的模型或客户端,正式使用前按作者说明确认。

Sortable 拖拽排序用什么许可证?

许可证标注为 未说明(许可证不明确)。商用或二次分发前请到仓库确认条款原文。

热门专题

按场景挑技能
全部专题 →

技能内容以作者仓库为准;分类、权限级别与许可证状态的中文说明为中文整理,最近核验 未标注。