🧊

BehaviorSubject

 

理解

 
BehaviorSubject 是 RxJS 中的一种特殊 Subject,它会维护当前值,并在订阅时立即将最新值发送给订阅者。
当一个新的订阅者订阅 BehaviorSubject 时,它将立即收到 BehaviorSubject 当前维护的值。这使得 BehaviorSubject 非常适合用于维护状态或为订阅者提供最新的数据。
例如,假设你有一个用于存储当前用户信息的 BehaviorSubject,在初始化时该 BehaviorSubject 的值为 null,当用户登录时,你可以使用 next() 方法将用户信息作为参数传递给 BehaviorSubject,以更新它的值:
 
const currentUserSubject = new BehaviorSubject(null);

function login(user) {
  currentUserSubject.next(user);
}
在其他地方,你可以订阅 currentUserSubject,以获取最新的用户信息:
 
currentUserSubject.subscribe(user => {
  console.log('The current user is', user);
});
 
如果在订阅 currentUserSubject 之前调用了 login() 方法,那么在订阅时,你将立即收到最新的用户信息,而不是 null。
 
 

使用 BehaviorSubject 来自定义最小的 Redux

在 Angular 中,你可以使用 BehaviorSubject 来实现一个简单的 Redux。首先,你需要创建一个 BehaviorSubject,它会保存你的应用状态:
import { BehaviorSubject } from 'rxjs';

const initialState = {
  count: 0
};

const store = new BehaviorSubject(initialState);
然后,你可以定义一些 action creators 来更新应用状态:
const increment = () => {
  const currentState = store.getValue();
  store.next({ ...currentState, count: currentState.count + 1 });
}

const decrement = () => {
  const currentState = store.getValue();
  store.next({ ...currentState, count: currentState.count - 1 });
}
最后,你可以订阅 store 来接收最新的应用状态,并在组件中使用它:
store.subscribe(state => {
  console.log(state);
});
使用这种方法,你就可以在 Angular 中实现一个简单的 Redux。当然,这只是一个简单的示例,你可以根据需要扩展它,比如定义多个 reducer 函数来处理不同的 action 等等。