资讯动态

Vue.Draggable 迁移指南:从 element / options 旧 API 平滑升级到 tag 与 Sortable 配置直传

发布时间:2026/9/20 8:31:21 来源:尧图企业网站定制
Vue.Draggable 迁移指南从 element / options 旧 API 平滑升级到 tag 与 Sortable 配置直传【免费下载链接】Vue.DraggableVue drag-and-drop component based on Sortable.js项目地址: https://gitcode.com/gh_mirrors/vu/Vue.Draggable导读Vue.Draggable基于 Sortable.js 的 Vue 2.0 拖拽组件在 v2.19 / v2.20 两个版本中先后引入了两处破坏性 API 调整element属性被废弃并推荐改用tagoptions属性被废弃并推荐将 Sortable 配置直接以 props 形式挂载到draggable上。本文以官方迁移文档 documentation/migrate.md 为核心骨架结合仓库源码src/vuedraggable.js与单元测试tests/unit/vuedraggable.spec.js逐条解读迁移原因、改写示例与底层原理帮助你完成升级后代码可读性更强、类型更清晰、与 Vue 组件体系完全对齐。迁移背景为什么需要升级本次迁移涉及两个被标记为 deprecated 的属性它们分别对应组件的两种职责废弃属性替代方案引入版本动机elementtag2.x 早期官方建议迁移与业界广泛使用的命名约定保持一致options直接 props /v-bindv2.20 起废弃v2.19 已支持直传借助 Vue 透明包装器transparent wrapper机制把 Sortable 配置当作普通 props 透传需要说明的是废弃不等于立即移除源码中这两个 props 仍然保留并兼容工作但会在控制台输出弃用警告详见下文源码佐证。仓库中 documentation/legacy.options.md 同样记录了options的弃用说明可作为交叉参考。一、element→tag迁移1.1 迁移示例element被废弃后应当改用tag属性二者的语义完全一致指定 draggable 组件作为外层包裹元素的 HTML 节点类型。迁移前draggable v-forlist elementul !-- -- /draggable迁移后draggable v-forlist tagul !-- -- /draggable1.2 源码佐证element 与 tag 的底层关系在 src/vuedraggable.js 中两个 props 的定义如下element: { type: String, default: div }, tag: { type: String, default: null },而getTag()方法的实现说明tag拥有更高优先级element只是历史兜底getTag() { return this.tag || this.element; }也就是说只要设置了tagelement的值就会被完全忽略两者都不设置时默认渲染为divREADME 中tag的默认值说明为div与源码默认行为一致。1.3 弃用警告的触发条件与验证在组件created生命周期中src/vuedraggable.js只要检测到element不是默认值div就会打印弃用警告if (this.element ! div) { console.warn( Element props is deprecated please use tag props instead. See ...migrate.md#element-props ); }注意如果你从未使用过element保持默认div不会触发警告只有显式传入elementul之类的非默认值才会提示。这一行为已被单元测试锁定见 tests/unit/vuedraggable.spec.js测试断言当propsData传入element: li时console.warn会被调用并携带指向本文档migrate.md#element-props的提示文案。1.4 扩展tag的进阶用法迁移到tag后其能力比旧的element更完整——除了普通的 HTML 标签名ul、span、div、table等还可以传入Vue 组件名作为外层元素当tag为组件名时draggable 组件会把相关 attribute 传递给被创建的组件若需要向该组件传 props、attrs 或事件监听请配合componentData属性参见 README 中的 componentData 说明。源码中getComponentAttributessrc/vuedraggable.js负责在渲染阶段将id、data-*属性以及componentData中的on/props/attrs合并到外层元素上这也是tag支持组件化外层容器的底层机制。仓库中的测试覆盖了ul、span、div三种标签的根元素渲染以及tag: child组件模式的 props / 事件 / 属性传递见 tests/unit/vuedraggable.spec.js。二、options→ 直接 props /v-bind迁移2.1 背景v2.20 的透明包装器机制options属性在 v2.20 版本被标记废弃。从该版本开始Vue.draggable 采用透明包装器transparent wrapper模式所有 Sortable 配置项都可以直接作为属性挂载到draggable实例上组件内部会把这些属性透传给底层的 Sortable 实例。这省去了手动书写:options{...}的冗余嵌套也让模板声明式地表达拖拽行为。2.2 迁移示例一静态配置对象迁移前拖拽手柄需要包一层对象draggable v-forlist :options{handle: .handle} !-- -- /draggable迁移后直接把 Sortable 的handle选项写为属性即可draggable v-forlist handle.handle !-- -- /draggable2.3 迁移示例二动态配置对象迁移前通过方法返回配置对象再绑定draggable v-forlist :optionsgetOptions() !-- -- /draggable迁移后使用 Vue 内置指令v-bind不带参数将对象展开为多个 propsdraggable v-forlist v-bindgetOptions() !-- -- /draggable这是两种合法的书写形态字面量场景直接在模板上写handle.handle、ghost-classghost等动态/批量场景用v-bindgetOptions()把返回的配置对象一次性展开等价于把对象中的每个键作为 props 传入。2.4 源码佐证$attrs 是如何变成 Sortable 选项的这一机制的核心在组件挂载阶段src/vuedraggable.js。组件声明了inheritAttrs: falsesrc/vuedraggable.js因此未被 props 声明的属性不会自动落到根元素上而是进入this.$attrs随后在mounted中被收集、驼峰化并合并进 Sortable 配置const attributes Object.keys(this.$attrs).reduce((res, key) { res[camelize(key)] this.$attrs[key]; return res; }, {}); const options Object.assign({}, this.options, attributes, optionsAdded, { onMove: (evt, originalEvent) { return this.onDragMove(evt, originalEvent); } });这里有两个值得注意的实现细节键名自动驼峰化camelize工具函数src/util/helper.js会把ghost-class这类 kebab-case 写法转换为 Sortable 期望的ghostClass。README 也明确说明kebab-case properties are supported例如ghost-classprops 会被转换为ghostClasssortable option。兼容性合并Object.assign({}, this.options, attributes, ...)意味着旧的options对象、新直传的$attrs、内部事件代理会按优先级依次合并后者覆盖前者——因此即使同时存在两种写法行为也有明确预期。此外mounted 末尾还会设置默认值src/vuedraggable.js!(draggable in options) (options.draggable *);即未显式声明draggable选项时默认只允许直接子元素参与拖拽。2.5 弃用警告与动态更新与element一样created钩子中检测到options被使用时同样会打印警告src/vuedraggable.jsif (this.options ! undefined) { console.warn( Options props is deprecated, add sortable options directly as vue.draggable item, or use v-bind. See ...migrate.md#options-props ); }对应的测试见 tests/unit/vuedraggable.spec.js传入options: { group: led zeppelin }时断言console.warn被调用。另一个重要能力是响应式更新组件对$attrs设置了深度 watchsrc/vuedraggable.js当属性变化时会调用updateOptionssrc/vuedraggable.js把每个驼峰化后的新值通过this._sortable.option(name, value)动态写入 Sortable 实例实现不重建实例的实时配置更新。单元测试通过 mock Sortable 断言了toBeCamelized: true的透传结果tests/unit/vuedraggable.spec.js。三、迁移注意事项与边界3.1 以on开头的方法选项不能直传不是所有 Sortable 选项都适合以 props 直传。组件内部定义了只读属性列表src/vuedraggable.jsconst readonlyProperties [Move, ...eventsListened, ...eventsToEmit].map( evt on evt );onStart、onAdd、onRemove、onUpdate、onEnd、onChoose、onUnchoose、onSort、onFilter、onClone、onMove这些回调无法通过 props 透传updateOptions会跳过它们因为 Vue.draggable 已经将这些回调映射为同名事件对外暴露start、add、remove、update、end、choose、unchoose、sort、filter、cloneonMove则映射为move属性。迁移时请改用事件监听draggable :listlist endonEnd changeonChange /draggable3.2 与内置 props 的区分直接透传的对象中如果包含与组件内置 props 同名的键如list、value、tag、move、clone、componentData、noTransitionOnDrag它们会被 Vue 的 props 声明捕获不会进入$attrs参与 Sortable 配置——这是透明包装机制与组件自身 API 之间天然的隔离边界使用v-bindgetOptions()时建议确保配置对象里只含 Sortable 选项。3.3 新旧写法并存期间的排查手段升级过程中可以依赖两个信号判断代码是否已迁移干净控制台警告任一draggable传入非默认element或传入了options控制台都会打印指向本迁移文档的警告文案见 1.3、2.5 节测试断言仓库单元测试对这两条警告文案做了精确断言如果你维护自己的组件测试可以仿照 tests/unit/vuedraggable.spec.js 的方式在测试中 spyconsole.warn并断言警告不再出现从而自动化地验证迁移完成度。3.4 综合迁移示例结合官方文档与 README 中的完整配置示例迁移后的典型写法如下README.mddraggable v-modellist tagul handle.handle :group{ name: people, pull: clone, put: false } ghost-classghost :sortfalse changelog !-- -- /draggabletagul替代旧的elementulhandle、group、ghost-class、sort直接作为 props 替代旧的:options对象写法事件如change保持与旧写法一致。仓库中 tests/unit/helper/DraggableWithList.vue 与 tests/unit/helper/DraggableWithModel.vue 展示了tagspan与v-model组合的实测用法可作为升级后的参照模板。结语本次迁移的本质是把 Vue.draggable 从一个包装了配置对象的组件演进为对 Sortable 全透明、可直传配置的组件element改为tag对齐了 Vue 生态通用的命名习惯options改为直接 props /v-bind则消除了模板中的一层对象嵌套并借助$attrs驼峰化、v-bind展开与_sortable.option动态更新机制让 Sortable 的全部配置都能以声明式、响应式的方式接入 Vue 模板体系。理解 src/vuedraggable.js 中getTag()、created警告、mounted阶段的Object.assign合并逻辑以及 src/util/helper.js 的camelize实现就能在升级时从容判断每一处改动的影响边界让迁移过程既快又稳。【免费下载链接】Vue.DraggableVue drag-and-drop component based on Sortable.js项目地址: https://gitcode.com/gh_mirrors/vu/Vue.Draggable创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价