[Rxjs] Build a basic application store with Subjects
Store.js
import { BehaviorSubject, Subject } from 'rxjs';
import { map, distinctUntilKeyChanged, scan } from 'rxjs/operators';
export class ObservableStore {
private _store: BehaviorSubject<any>;
private _stateUpdate = new Subject();
constructor(initialState) {
this._store = new BehaviorSubject(initialState);
this._stateUpdate.pipe(
/*
* Accumulate state over time using scan.
* For this example we will just merge our current state
* with updated state and emit the result, however
* this could be any reducer / pattern you wish to follow.
*/
scan((current, updated) => {
return { ...current, ...updated }
}, initialState)
).subscribe(this._store);
}
/*
* Select a slice of state based on key.
*/
selectState(key: string) {
return this._store.pipe(
distinctUntilKeyChanged(key),
map(state => state[key])
);
}
/*
* Update state with new object to merge.
*/
updateState(newState: object) {
this._stateUpdate.next(newState);
}
/*
* Subscribe to any store state changes.
*/
stateChanges() {
return this._store.asObservable();
}
}
index.js
import { ObservableStore } from './store';
const store = new ObservableStore({
user: 'joe',
isAuthenticated: true
});
/*
* Select a slice of state from store.
*/
store.selectState('user').subscribe(console.log);
/*
* Update a property with new value.
*/
store.updateState({
user: 'bob'
});
store.updateState({
isAuthenticated: true
});
/*
* Selected state above (user) only emits when value has changed
* for the requested property.
*/
store.updateState({
isAuthenticated: false
});
分类:
RxJS
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2021-09-26 [Cloud Architect] 7. Serverless Computing
2018-09-26 [RxJS] Create a Reusable Operator from Scratch in RxJS
2018-09-26 [RxJS] Use `lift` to Connect a `source` to a `subscriber` in RxJS
2017-09-26 [Javascirpt AST] Babel Plugin -- create new CallExpression
2017-09-26 [Python] Object spread operator in Python
2017-09-26 [Javascript AST] 3. Continue: Write ESLint rule
2016-09-26 [Angular2 Router] Configuring a Home Route and Fallback Route - Learn An Essential Routing Concept