React变更 - Node.js SDK
Realm 中的数据是实时的,这意味着对象始终反映其最近保存的状态,并且读取操作永远不会阻塞。 对象会自动更新以响应更改,因此您可以在应用程序中查看最新数据,而无需运行新查询。 对象和查询会发出通知,以便在数据发生变化时更新您的应用程序。
您可以注册三种类型的通知监听器:
每当 Realm 中的任何对象发生变化时,就会触发 Realm 监听器。
每当特定查询与一组新对象匹配或任何匹配对象发生变化时,就会触发集合监听器。
每当删除特定对象或修改一个或多个属性时,就会触发对象监听器。
注册 Realm 变更监听器
要为整个域注册变更侦听器,请将回调函数传递给 Realm 的 addListener()方法。 每当操作添加、更改或删除域中的对象时, Realm都会异步调用侦听器。
要移除域监听器,请将回调函数传递给域的 removeListener() 方法。
// Define a listener callback function function onRealmChange() { console.log("Something changed!"); } // Add the listener callback to the realm try { realm.addListener("change", onRealmChange); } catch (error) { console.error( `An exception was thrown within the change listener: ${error}` ); } // Remember to remove the listener when you're done! realm.removeListener("change", onRealmChange);
注册集合变更监听器
要为一组 Realm 对象注册变更监听器,请将回调函数传递给集合的 addListener() 方法。Realm 在注册时以及每当操作添加、更改或删除集合中的对象时都会异步调用监听器。
要删除集合监听器,请将回调传递给集合的 removeListener() 方法。
重要
顺序很重要
在集合通知处理程序中,始终按以下顺序应用变更:删除、插入和修改。在删除操作之前处理插入操作可能会导致意外行为。
// You can define a listener for any collection of Realm objects const dogs = realm.objects("Dog"); // Define a listener callback function for changes to any Dog function onDogsChange(dogs, changes) { // Handle deleted Dog objects changes.deletions.forEach((index) => { // You cannot directly access deleted objects, // but you can update a UI list, etc. based on the index. console.log(`Looks like Dog #${index} has left the realm.`); }); // Handle newly added Dog objects changes.insertions.forEach((index) => { const insertedDog = dogs[index]; console.log(`Welcome our new friend, ${insertedDog.name}!`); }); // Handle Dog objects that were modified changes.modifications.forEach((index) => { const modifiedDog = dogs[index]; console.log(`Hey ${modifiedDog.name}, you look different!`); }); } // Add the listener callback to the collection of dogs try { dogs.addListener(onDogsChange); } catch (error) { console.error( `An exception was thrown within the change listener: ${error}` ); } // Remember to remove the listener when you're done! dogs.removeListener(onDogsChange);
注册对象变更侦听器
要在特定 Realm 对象上注册变更监听器,请将回调函数传递给对象的 addListener() 方法。如果对象的任何属性发生变更或者有人删除了对象,Realm 就会调用监听器。
要移除对象监听器,请将回调函数传递给对象的 removeListener() 方法。
// Define a listener callback function for changes to a specific Dog function onDogChange(dog, changes) { if (changes.deleted) { console.log(`dog is deleted: ${changes.deleted}`); } else { changes.changedProperties.forEach((prop) => { console.log(`* the value of "${prop}" changed to ${dog[prop]}`); }); } } // You can define a listener for any Realm object try { dog.addListener(onDogChange); } catch (error) { console.error( `An exception was thrown within the change listener: ${error}` ); } // Remember to remove the listeners when you're done! dog.removeListener(onDogChange);
删除所有变更监听器
要删除给定 Realm、对象或集合实例上的所有监听器,请调用实例的 removeAllListeners()
函数:
// Remove all listeners from a realm realm.removeAllListeners(); // Remove all listeners from a collection dogs.removeAllListeners(); // Remove all listeners from an object dog.removeAllListeners();
变更通知限制
嵌套文档中深度超过四级的变更不会触发变更通知。
如果您的数据结构需要侦听第五层深度或更深层的更改,解决方法包括:
重构模式以减少嵌套。
添加“推送以刷新”一类的内容,使用户能够手动刷新数据。