|
4 | 4 | * @author Houfeng <houzhanfeng@gmail.com> |
5 | 5 | */ |
6 | 6 |
|
7 | | -import { DependencyList, useLayoutEffect, useMemo } from "react"; |
8 | | -import { autorun, observable, watch } from "ober"; |
| 7 | +import { DependencyList, useCallback, useLayoutEffect, useMemo } from "react"; |
| 8 | +import { autorun, computable, observable, watch } from "ober"; |
9 | 9 |
|
| 10 | +/** |
| 11 | + * 在函数组件中即时创建一个可观察对象 |
| 12 | + * @param value 对象或创建对象的函数 |
| 13 | + * @param deps 指定的依赖发生变化时,将重新创建 |
| 14 | + * @returns 可观察对象 |
| 15 | + */ |
| 16 | +export function useObservable<T extends object>( |
| 17 | + value: T | (() => T), |
| 18 | + deps: DependencyList = [] |
| 19 | +): T { |
| 20 | + return useMemo<T>(() => { |
| 21 | + return observable(value instanceof Function ? value() : value); |
| 22 | + }, deps); |
| 23 | +} |
| 24 | + |
| 25 | +/** |
| 26 | + * 创建一个观察器,每当用到的数据发生变化时,将重新计算 |
| 27 | + * @param selector 计算函数,需返回一个值,将对新旧值进行浅对比,决定是否调用执行函数 |
| 28 | + * @param handler 执行函数,由 selector 的计算结果决定是否重新执行 |
| 29 | + * @param immed 是否立即执行一次 handler |
| 30 | + */ |
10 | 31 | export function useWatch( |
11 | 32 | selector: () => any, |
12 | | - handler: () => void, |
| 33 | + handler: (newValue?: any, oldValue?: any) => void, |
13 | 34 | immed = false |
14 | 35 | ) { |
15 | 36 | return useLayoutEffect(() => watch(selector, handler, immed), [immed]); |
16 | 37 | } |
17 | 38 |
|
| 39 | +/** |
| 40 | + * 启动一个自执行函数,当函数中用到的数据发生变化时它将自动重新执行 |
| 41 | + * @param handler 将执行的函数 |
| 42 | + */ |
18 | 43 | export function useAutoRun(handler: () => void) { |
19 | 44 | return useLayoutEffect(() => autorun(handler), []); |
20 | 45 | } |
21 | 46 |
|
22 | | -export function useObservable<T extends object>( |
23 | | - value: T | (() => T), |
24 | | - deps: DependencyList = [] |
25 | | -): T { |
26 | | - return useMemo<T>(() => { |
27 | | - return observable(value instanceof Function ? value() : value); |
28 | | - }, deps); |
| 47 | +/** |
| 48 | + * 创建一个具备缓存能力的计算结果, |
| 49 | + * 计算函数用到的数据发生变化时将重新计算并驱动组件更新,否则将使用缓存 |
| 50 | + * @param fn 计算函数 |
| 51 | + * @returns 计算结果 |
| 52 | + */ |
| 53 | +export function useComputed<T>(fn: () => T): T { |
| 54 | + const compute = useCallback(computable(fn, { bind: false }), []); |
| 55 | + useLayoutEffect(() => { |
| 56 | + compute.subscribe!(); |
| 57 | + return () => compute.unsubscribe!(); |
| 58 | + }); |
| 59 | + return compute(); |
29 | 60 | } |
0 commit comments