use-sluggish-state
v6.0.0
Published
A react hook for setting state after a specific delay, built with typescript in mind.
Downloads
9
Maintainers
Readme
use-sluggish-state
useSluggishState
A react hook for setting state after a specific delay, built with typescript in mind. The basic idea behind this is that you can schedule a state update and if you want perform a transition before the state update completes.
Install
npm install use-sluggish-stateUsage
import useSluggishState from 'use-sluggish-state';
const [isDarkMode, setIsDarkMode] = useSluggishState(true, 500);
console.log(isDarkMode);
// => true
setIsDarkMode(false);
console.log(isDarkMode);
// => true
// Darkmode is still true
console.log(isDarkMode);
// After 500 milliseconds
// => falseOR with typescript
import useSluggishState from 'use-sluggish-state';
const [isVisible, setIsVisible] = useSluggishState<boolean | undefined>(
true,
5000
);
// ERROR:
// Typescript should throw an error at this
setIsVisible('yes');
// SUCCESS:
// This should pass
setIsVisible(false);If no generic is passed, the type is also inferred from the initial value, just the same as in react useState
import useSluggishState from 'use-sluggish-state';
const [isVisible, setIsVisible] = useSluggishState(true, 5000);
// ERROR:
// Typescript should also throw an error at this
setIsVisible('yes');
// SUCCESS:
// This should pass
setIsVisible(false);Also allows a callback to be passed as the parameter of setState.
import useSluggishState from 'use-sluggish-state';
const [isDarkMode, setIsDarkMode] = useSluggishState(true, 100);
// Toggle dark mode on/off after 100 milliseconds
setIsDarkMode(prev => !prev);delay can be specified for a specific setState action than that which was already set in the hook.
Note: this does not change the original delay for subsequent
setStatecalls
import useSluggishState from 'use-sluggish-state';
const [showPopup, setShowPopup] = useSluggishState(true, 1000);
// Shows popup after 5 seconds
setShowPopup(true, 5000);
// Shows popup after 1 second
setShowPopup(true);Calling setState with a value does not change the state in the already executing code.
import useSluggishState from 'use-sluggish-state';
const [names, setNames] = useSluggishState('Bob');
setNames(names + ', Bonnie');
setNames(names + ', Clyde', 2000);
console.log(names);
// => "Bob, Bonnie"
// => "Bob, Clyde"However when called with a callback, the previous state since the last setState call can be accessed
import useSluggishState from 'use-sluggish-state';
const [owner, setOwner] = useSluggishState('Bob');
setNames(prev => prev + ', Bonnie');
setNames(prev => prev + ', Clyde', 2000);
console.log(owner);
// => "Bob, Bonnie"
// => "Bob, Bonnie, Clyde"Note: the state updates occur in the order of the delay
setStateis called with
import useSluggishState from 'use-sluggish-state';
const [owner, setOwner] = useSluggishState('Bob');
setNames(prev => prev + ', Bonnie', 3000);
setNames(prev => prev + ', Clyde', 2000);
console.log(owner);
// => "Bob, Clyde"
// => "Bob, Clyde, Bonnie"DEBOUNCE
Achieve Debounce in the simplest way
import useSluggishState from 'use-sluggish-state';
const SomeComponent = () => {
const [searchQuery, setSearchQuery, _loading, finalQuery] =
useSluggishState('gribble');
const onChange = event => {
setSearchQuery(event.target.value, 1000);
};
useEffect(() => {
// fetch will be called only when user has stopped typing for 1 second
fetch(`path/to/api?search=${searchQuery}`);
}, [searchQuery]);
return <input value={finalQuery} onChange={onChange} />;
};API
const [state, setState, loading, finalState] = useSluggishState(value?, delay?)
state
The state variable initialized by the value property passed in the hook
Type: Infered from the value passed in. If no value is passed, it defaults to undefined. Also defined by passing in a generic e.g <boolean> like in the typescript example above.
setState
Function to trigger a state update. Works like the typical react setState.
Type:
Dispatch<React.SetStateAction<InferredType>>;
// Where `InferredType` is the type of the passed value or undefined
// OR
Dispatch<React.SetStateAction<DefinedType>>;
// Where `DefinedType` is the generic passed to `useStoreState` i.e boolean, string.loading
Indicates whether a state update is in progress or not.
Type: Boolean
finalState
The instant updated state not affected by the delay.
Type: Same as in state above
value?
Required: NO
Default: undefined
Type: any
delay? (milliseconds)
Required: NO
Default: 0
Type: number
type Dispatch
Definition:
type Dispatch<A> = (value: A, _delay?: number) => void;Usage:
import { type Dispatch } from 'use-sluggish-state';
const customSetState: Dispatch<React.SetStateAction<InferredType>>;