为何Angular Signals调用mutate()时不执行自定义equal校验?
关于Angular Signal的mutate()方法添加相等校验参数的疑问
我有一个代表假想仪表板的Angular Signal,简化示例如下:
type DashboardStats = { activeUsers: number, orderCount: number, revenue: number, // 其他字段 } // 使用lodash的相等比较函数 const dashboard = signal<DashboardStats>(initialState, { equal: isEqual } );
假设我每分钟轮询订单服务,需要将updatedOrderCount更新到仪表板中,目前有两种更新Signal的方式:update()或mutate()。
使用update()的实现方式
dashboard.update(currentValue => { return { ...currentValue, orderCount: updatedOrderCount } })
执行自定义的updateFn后,lodash的isEqual方法会进行全字段深度对比。如果过去一分钟没有新订单,Signal的值不会变化,也就不会通知依赖它的computed信号或组件模板等消费者。
使用mutate()的实现方式
dashboard.mutate(dashboard => { dashboard.orderCount = updatedOrderCount; })
这种写法可读性更强,但根据官方文档说明:
For writable signals, .mutate() does not check for equality because it mutates the current value without producing a new reference.
这会导致每次调用mutate()时,Signal的值都会被标记为变更,触发UI更新或依赖它的computed信号重新计算。对于简单场景影响不大,但在复杂信号或computed信号链的场景下,会引发额外性能开销,同时增加调试难度。
Angular的设计逻辑是mutate意味着开发者确认要修改值,那为什么不能为mutate()添加可选参数来强制执行相等校验呢?比如:
mutate(mutatorFn: (value: T) => void, runEqual?: boolean): void;
让开发者可以在mutate后强制触发equal函数,提升开发体验?
内容的提问来源于stack exchange,提问作者Simon_Weaver
相关产品推荐
相关产品推荐

