@react-hookz/web
Version:
React hooks done right, for browser and SSR.
25 lines (24 loc) • 913 B
JavaScript
import { useCallback, useRef } from 'react';
import { useFirstMountState, useRerender } from '..';
import { resolveHookState } from "../util/resolveHookState.js";
/**
* Like `React.useState`, but its state setter accepts extra argument, that allows to cancel
* rerender.
*/
export function useControlledRerenderState(initialState) {
var state = useRef(useFirstMountState() ? resolveHookState(initialState) : undefined);
var rr = useRerender();
return [
state.current,
useCallback(function (value, rerender) {
var newState = resolveHookState(value, state.current);
if (newState !== state.current) {
state.current = newState;
if (typeof rerender === 'undefined' || rerender) {
rr();
}
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []),
];
}