ReactiveDict
Documentation of ReactiveDict, a simple reactive dictionary package.
A ReactiveDict stores an arbitrary set of key-value pairs. Use it to manageinternal state in your components, ie. like the currently selected item in a list.Each key is individully reactive such that calling set
for a key will invalidate any Computations that called get
with that key, according to theusual contract for reactive data sources.
That means if you call ReactiveDict#get
('currentList')
from inside a Blaze template helper, the template will automatically be rerenderedwhenever ReactiveDict#set
('currentList', x)
is called.
To use ReactiveDict
, add the reactive-dict
package to your project by runningin your terminal:
meteor add reactive-dict
Client
new ReactiveDict([name], [initialValue])
import { ReactiveDict } from 'meteor/reactive-dict' (reactive-dict/reactive-dict.js, line 32)
Constructor for a ReactiveDict, which represents a reactive dictionary of key/value pairs.
Arguments
- nameString
Optional. When a name is passed, preserves contents across Hot Code Pushes
initialValueObject
- Optional. The default values for the dictionary
If you provide a name to its constructor, its contents will be saved across HotCode Push client code updates.
Client
ReactiveDict#set(key, value)
(reactive-dict/reactive-dict.js, line 84)
Set a value for a key in the ReactiveDict. Notify any listenersthat the value has changed (eg: redraw templates, and rerun anyTracker.autorun
computations, that calledReactiveDict.get
on this key
.)
Arguments
- keyString
The key to set, eg,
selectedItem
valueEJSON-able Object or undefined
- The new value for
key
Example:
const state = new ReactiveDict();
state.set('currentRoomId', 'random')
Tracker.autorun(() => {
Meteor.subscribe('chatHistory', { room: state.get('currentRoomId') });
});
// Causes the function passed to `Tracker.autorun` to be rerun, so that the
// 'chatHistory' subscription is moved to the room 'general'.
state.set('currentRoomId', 'general');
ReactiveDict.set
can also be called with an object of keys and values, which isequivalent to calling ReactiveDict.set
individually on each key/value pair.
const state = new ReactiveDict();
state.set({
a: 'foo',
b: 'bar'
});
Client
ReactiveDict#setDefault(key, value)
(reactive-dict/reactive-dict.js, line 126)
Set a value for a key if it hasn't been set before.Otherwise works exactly the same as ReactiveDict.set
.
Arguments
- keyString
The key to set, eg,
selectedItem
valueEJSON-able Object or undefined
- The new value for
key
This is useful in initialization code, to avoid re-initializing your stateevery time a new version of your app is loaded.
Client
ReactiveDict#get(key)
(reactive-dict/reactive-dict.js, line 152)
Get the value assiciated with a key. If inside a reactivecomputation, invalidate the computation the next time thevalue associated with this key is changed byReactiveDict.set
.This returns a clone of the value, so if it's an object or an array,mutating the returned value has no effect on the value stored in theReactiveDict.
Arguments
- keyString
- The key of the element to return
Example:
<!-- main.html -->
<template name="main">
<p>We've always been at war with {{theEnemy}}.</p>
<button class="change-enemy">Change Enemy</button>
</template>
// main.js
Template.main.onCreated(function () {
this.state = new ReactiveDict();
this.state.set('enemy', 'Eastasia');
});
Template.main.helpers({
theEnemy() {
const inst = Template.instance();
return inst.state.get('enemy');
}
});
Template.main.events({
'click .change-enemy'(event, inst) {
inst.state.set('enemy', 'Eurasia')
}
});
// Clicking the button will change the page to say "We've always been at war with Eurasia"
Client
ReactiveDict#equals(key, value)
(reactive-dict/reactive-dict.js, line 167)
Test if the stored entry for a key is equal to a value. If inside areactive computation, invalidate the computation the nexttime the variable changes to or from the value.
Arguments
- keyString
The name of the session variable to test
valueString, Number, Boolean, null, or undefined
- The value totest against
If value is a scalar, then these two expressions do the same thing:
const state = new ReactiveDict()
// ...
state.get('key') === value
state.equals('key', value)
However, the second is recommended, as it triggers fewer invalidations(template redraws), making your program more efficient.
Client
ReactiveDict#all()
(reactive-dict/reactive-dict.js, line 229)
Get all key-value pairs as a plain object. If inside a reactivecomputation, invalidate the computation the next time thevalue associated with any key is changed byReactiveDict.set
.This returns a clone of each value, so if it's an object or an array,mutating the returned value has no effect on the value stored in theReactiveDict.
Client
ReactiveDict#clear()
(reactive-dict/reactive-dict.js, line 245)
remove all key-value pairs from the ReactiveDict. Notify anylisteners that the value has changed (eg: redraw templates, and rerun anyTracker.autorun
computations, that calledReactiveDict.get
on this key
.)
Client
ReactiveDict#destroy()
(reactive-dict/reactive-dict.js, line 293)
Clear all values from the reactiveDict and prevent it from beingmigrated on a Hot Code Pushes. Notify any listenersthat the value has changed (eg: redraw templates, and rerun anyTracker.autorun
computations, that calledReactiveDict.get
on this key
.)