crimx/observable-hooks

违背hooks原则

mankeheaven opened this issue · 1 comments

hooks是依赖顺序的,以下代码应该会报错,至于为啥违反了react原则又没报错,这个很有水准

export function useObservableInternal<TOutput, TInputs extends Readonly<any[]>>(
  useCustomEffect: typeof useEffect,
  init:
    | (() => Observable<TOutput>)
    | ((inputs$: Observable<[...TInputs]>) => Observable<TOutput>),
  inputs?: [...TInputs]
): Observable<TOutput> {
  if (!inputs) {
    return useRefFn(init as () => Observable<TOutput>).current
  }

  const inputs$Ref = useRefFn(() => new BehaviorSubject(inputs))
  const source$Ref = useRefFn(() => init(inputs$Ref.current))

  const firstEffectRef = useRef(true)
  useCustomEffect(() => {
    if (firstEffectRef.current) {
      firstEffectRef.current = false
      return
    }
    inputs$Ref.current.next(inputs)
  }, inputs)

  return source$Ref.current
}
crimx commented

https://observable-hooks.js.org/zh-cn/api/#useobservablestate
见文档说明,这是兼容了两个不一样的使用场景,所以不会冲突。但如果让我再设计一遍可能不会这么*了嘻嘻😁。