想去哪里?

首页 页面 关于 页面 项目 页面 简历 页面 技术 页面 随笔 页面 联系 页面 隐私政策 页面 Terminal Spike 隐私政策 页面 用 Astro 构建文档与职业个人网站 技术 通过 tmux、Mosh、Termius 与 Tailscale 随处使用 Codex 技术 用 Langfuse 观察 Codex 的 MCP 工具调用 技术 产品应用中的本地化 技术 把 MCP 作为安全的 AI 集成边界 技术 用 Zod、OpenAPI 与 Swagger 维护 API 契约 技术 用 pg-boss 运行持久后台任务 技术 通过真实知识工作流理解 pgvector 与 RAG 技术 Pi Edge:让 Pi 待在 Obsidian 笔记旁 技术 为真实排序任务设计拖放交互 技术 Prisma 与 PostgreSQL:产品状态的事实来源 技术 把 Ralph Loop 当作计划队列 技术 用 React Router 组织全栈产品工作流 技术 把 shadcn 风格组件变成自己的产品系统 技术 用表格与编辑器承载密集业务操作 技术 Terminal Spike:原生 Android 终端 技术 在 Linux 上用 fcitx 输入带声调的拼音 技术 在 Linux 上配置 DEFT Pro 轨迹球 技术 在 KOReader 上使用 Pocket 稍后读 技术 为 Vercel AI SDK 设置明确的工具边界 技术 垂直切片架构与 dependency-cruiser 技术 用 Vitest 与 Playwright 测试产品工作流 技术 我的随处工作流:Herdr、code-server、Obsidian 与 Pi Edge 技术 Zod 不只是校验 技术 《卡拉马佐夫兄弟》是我看过最好的小说 随笔 基督徒口述1960劳改历史 随笔 圣经中的“道”与言语 随笔 我们爱,因为神先爱我们,而不是空洞的“自爱” 随笔 妈妈,让我来承担爸爸的过错吧 随笔 我与神的故事 随笔 世界远离上帝,接近中国 随笔 “爱的五种语言”和内外向,只存在于语言中 随笔 人格类型不存在,你在世界而非概念中生活 随笔 危险的词语:为什么心理学是不可能的 随笔 2000 年,一个深圳打工者的故事 随笔 阿联酋Ras al Khaimah见闻录 随笔 沙甸:1975 年的一场冲突 随笔 关于中国的纪录片 随笔
← 技术/工程实践

为真实排序任务设计拖放交互

让拖放支持实际排序,同时保留键盘操作与明确的保存规则。

演示里加入拖放很容易,让它可靠地服务真实工作则更难。

产品要回答的不是“元素能否移动”,而是用户能否安全调整顺序、理解变化、保存结果,并在出错时恢复。

1. 用户调整步骤顺序
2. 界面显示未保存修改
3. 用户保存新顺序
4. 服务器校验顺序
5. 页面显示已保存结果

这与只修改客户端状态不同。顺序通常影响后续工作流,保存失败时,应用不应假装结果已持久化。

Pragmatic Drag and Drop 等库负责困难的交互模式,同时让产品保留数据模型的决定权。拖放应产生清楚的排序意图,而不是决定业务规则。

type ReorderInput = {
  itemId: string;
  beforeItemId?: string;
  afterItemId?: string;
};

具体结构可以变化,重点是界面发送明确操作,而不是含糊的客户端状态包。

真实排序任务不能只有拖放一条路。用户需要能通过无需鼠标、容易理解和访问的控件将项目上移或下移。

保存方式也很重要。即时保存看起来快,但用户想连续移动多次、检查最终顺序时,批量保存更从容。界面应明确展示已修改但未保存的状态。

服务器仍需拒绝缺失项目、重复位置和无权执行的修改。客户端能帮助避免错误,却不能是唯一防线。

排序界面有比初看更多的状态:空闲、拖动、已修改未保存、保存中、已保存和失败。不设计这些状态,用户就会困惑:改变的是屏幕上的顺序,还是产品中的顺序?

排序频繁且视觉位置有助于任务时,我会使用拖放;普通优先级数字、选择菜单或上下移动按钮更清晰时,就不用。

目的不是让界面显得活泼,而是让用户表达真实的排序决定,并可靠地保存下来。