You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular CDK拖拽排序cdkDropListDropped事件order属性提前更新原因?

原因说明

这是浏览器控制台的惰性求值特性导致的,和拖拽逻辑、Angular框架无关:
你向console.log()传入数组、对象这类引用类型的值时,控制台不会立刻存储该引用指向内容的快照,只会记录对应的内存引用地址。当你手动点击控制台的输出结果展开查看详情时,浏览器才会读取该引用指向的当前内存值,而此时你写在console.log()后的forEach修改order属性的逻辑已经执行完成,因此你看到的是修改后的属性值。

验证方法

如果需要打印console.log()执行瞬间的真实数组状态,可以主动做快照序列化,避免读取最新的引用值:

// 方式1:序列化后再反序列化得到当前状态的深拷贝
console.log(JSON.parse(JSON.stringify(this.states)))

// 方式2:直接打印序列化字符串
console.log(JSON.stringify(this.states))

执行上述代码后你就能看到符合预期的、forEach修改前的数组状态。

代码优化建议

你当前更新order属性的写法效率较低,forEach遍历中每次调用indexOf都会额外遍历一次数组,数组元素较多时性能损耗明显,可以直接用forEach的第二个参数获取当前索引:

this.states.forEach((item, index) => {
  item.order = index
})

内容的提问来源于stack exchange,提问作者JarsOfJam-Scheduler

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 05:30:04