也就是说,当对象属性发生变化时,如何触发回调?
这是上述问题的一般解决方案。如果您只需要 a 数组的特定用例解决方案,请忽略此问题。
检查ES6 Proxies 是否有比简单的getter/setter 更强大的get/set 拦截功能。由于您有一个嵌套的数据结构,因此您可能希望使用代理进行递归包装。像这样的:
function wrapWithProxyCallback(obj, callback) {
return new Proxy(obj, {
get (target, key, receiver) {
const result = Reflect.get(target, key, receiver)
// wraps nested data with Proxy
if (typeof result === 'object' && result !== null) {
return wrapWithProxyCallback(result, callback)
}
return result
},
set (target, key, value, receiver) {
// calls callback on every set operation
callback(target, key, value /* and whatever else you need */)
return Reflect.set(target, key, value, receiver)
}
})
}
并像这样使用它:
const wrappedClass = wrapWithCallback(
myClass,
(target, key) => console.log(target[key])
)
// this will call the above callback
wrappedClass.a.push(1);
这有点幼稚,但总体来说是一个很好的起点。例如,您可能需要检查嵌套数据是否已被代理包装。
您想要做的可能是与透明反应性很好地保持一致(不过,我必须查看您的回调内容才能确定这一点。)我认为您应该查看 mobx 或 @nx-js/observer-util(后者由我编写)用于生产就绪的盒装解决方案。
编辑:我的第一个示例触发了 get 操作的回调,我更正了它以触发 set 操作。