UNPKG

869 BJavaScriptView Raw
1import { useState, useEffect, useCallback } from "react";
2import { Subject } from "rxjs";
3import useConstant from "./useConstant";
4
5/**
6 * useEventCallback
7 * @param {Function} callback - 工厂函数, 生产者
8 * @param {Any} initialState - 初始值
9 * @return {Array} [callback, value]
10 */
11export default function useEventCallback(callback, initialState) {
12 const [state, setState] = useState(initialState);
13 const event$ = useConstant(() => new Subject());
14
15 function eventCallback(e) {
16 return event$.next(e);
17 }
18
19 const returnedCallback = useCallback(eventCallback, []);
20
21 useEffect(() => {
22 let value$ = callback(event$);
23 const subscription = value$.subscribe(value => setState(value));
24 // clear on unmount
25 return () => {
26 subscription.unsubscribe();
27 event$.complete();
28 };
29 }, []);
30
31 return [returnedCallback, state];
32}