reshow-flux
Version:
The smallest react flux and Fast hook alternative
38 lines (34 loc) • 1.1 kB
JavaScript
// @ts-check
import { useRef } from "react";
import useStore from "./useStore.mjs";
import ImmutableStore, { StateMap } from "./ImmutableStore.mjs";
/**
* @typedef {import("reshow-flux-base").ActionObject} ActionObject
*/
/**
* @template StateType
* @typedef {import("reshow-flux-base").InitStateType<StateType>} InitStateType
*/
/**
* useState alternative but implement by Immutable.
* https://reactjs.org/docs/hooks-reference.html#usestate
*
*
* ## Base usage
* const [state, setState] = useImmutable(initialState);
*
* call setState will trigger re-render.
* could use setState for partial update.
*
* @template [StateType=StateMap]
* @param {InitStateType<StateType>} [initialState]
* @returns {[StateMap, import("reshow-flux-base").DispatchFunction<StateMap, ActionObject>]}
*/
var useImmutable = function useImmutable(initialState) {
var lastReduce = useRef(/** @type any */null);
if (!lastReduce.current) {
lastReduce.current = ImmutableStore(null, initialState);
}
return [useStore(lastReduce.current[0]), lastReduce.current[1]];
};
export default useImmutable;