@ovine/core
Version:
Build flexible admin system with json.
36 lines (35 loc) • 1.14 kB
JavaScript
/**
* 公用的hooks 封装
*/
import produce from 'immer';
import { isArray } from 'lodash';
import { useCallback, useRef, useEffect, useReducer, useState } from 'react';
import { subscribe, Handler } from "./message";
export function useImmer(initialValue) {
const [val, updateValue] = useState(initialValue);
return [
val,
useCallback((updater) => {
updateValue(produce(updater));
}, []),
];
}
export function useImmerReducer(reducer, initialState, initialAction) {
const cachedReducer = useCallback(produce(reducer), [reducer]);
return useReducer(cachedReducer, initialState, initialAction);
}
export function useSubscriber(key, handler) {
const deps = isArray(key) ? key : [key];
useEffect(() => {
const { unsubscribe } = subscribe(key, handler);
return unsubscribe;
}, deps);
}
export function usePersistFn(fn) {
const ref = useRef(() => {
throw new Error('Cannot call function while rendering.');
});
ref.current = fn;
const persistFn = useCallback(((...args) => ref.current(...args)), [ref]);
return persistFn;
}