# 结合 React Context 使用

通过 React Context (opens new window) 可以很方便将数据传到任意层级的子组件树中。

本文将分享几个 observable-hooks 结合 React Context 使用的模式。

可以查看 context 项目样例。

# 普通传值

通常我们直接往 Context 传普通的值,然后通过 useContext (opens new window) 在组件中拿到。

可以利用 useObservable 获取 Context 值变化。

const normalValue = useContext(NormalValueContext)

const normalValueList$ = useObservable(
  inputs$ => inputs$.pipe(
    scan((acc, inputs) => [...acc, ...inputs], []),
    take(10)
  ),
  [normalValue]
)

# 传 Observable

另一种方式是向 Context 传 Observables。

这些来自 Context 的 Observables 可以通过 useSubscription 订阅。而且,如果传下来的 Observables 发生了变化它还会安全地自动切换去订阅新的 Observables。

const num$ = useContext(ObservableValueContext)
useSubscription(num$, value => {
  console.log('useSubscription', value)
})

useObservableState 以及其它 state 相关的 hooks 都一样,因为它们底下都是用 useSubscription 订阅。

const num$ = useContext(ObservableValueContext)
const num = useObservableState(num$)
console.log('useObservableState', num)

如果你需要对传下来的 Observable 进行变换(pipe)操作,则应该将其定义为依赖,因为它有可能会改变。

const num$ = useContext(ObservableValueContext)

const numList$ = useObservable(
  input$ => input$.pipe(
    switchMap(([num$]) =>
      num$.pipe(
        scan((acc, inputs) => [...acc, inputs], []),
        take(20)
      )
    )
  ),
  [num$]
)