1
This commit is contained in:
+21
@@ -0,0 +1,21 @@
|
||||
import { useState } from 'react';
|
||||
import useLayoutEffect from "./useLayoutEffect";
|
||||
/**
|
||||
* Similar to `useState` but will use props value if provided.
|
||||
* From React 18, we do not need safe `useState` since it will not throw for unmounted update.
|
||||
* This hooks remove the `onChange` & `postState` logic since we only need basic merged state logic.
|
||||
*/
|
||||
export default function useControlledState(defaultStateValue, value) {
|
||||
const [innerValue, setInnerValue] = useState(defaultStateValue);
|
||||
const mergedValue = value !== undefined ? value : innerValue;
|
||||
useLayoutEffect(mount => {
|
||||
if (!mount) {
|
||||
setInnerValue(value);
|
||||
}
|
||||
}, [value]);
|
||||
return [
|
||||
// Value
|
||||
mergedValue,
|
||||
// Update function
|
||||
setInnerValue];
|
||||
}
|
||||
Reference in New Issue
Block a user