@uifabric/react-hooks
Fluent UI React hooks
Helpful hooks not provided by React itself. These hooks were built for use in Fluent UI React (formerly Office UI Fabric React) but can be used in React apps built with any UI library.
- useConst - Initialize and return a value that's always constant
- useConstCallback - Like
useConst
but for functions - useId - Get a globally unique ID
- useBoolean - Return a boolean value and callbacks for setting it to true or false, or toggling
useConst
function useConst<T>(initialValue: T | (() => T)): T
Hook to initialize and return a constant value. Unlike React.useMemo
, this will always return the same value (and if the initializer is a function, only call it once). This is similar to setting a private member in a class constructor.
Its one parameter is the initial value, or a function to get the initial value. Similar to useState
, only the first value/function passed in is respected.
If the value should ever change based on dependencies, use React.useMemo
instead.
If the value itself is a function, consider using useConstCallback
instead.
Example
import { useConst } from '@uifabric/react-hooks';
const MyComponent = () => {
const value = useConst(() => {
});
const valueThatMustNeverChange = useConst();
...
};
Why not just useMemo
?
According to the React docs:
You may rely on useMemo
as a performance optimization, not as a semantic guarantee. In the future, React may choose to “forget” some previously memoized values and recalculate them on next render, e.g. to free memory for offscreen components. Write your code so that it still works without useMemo
— and then add it to optimize performance.
In cases where the value must never change, the recommended workaround is to store it with useRef
, but refs are more awkward to initialize and don't enforce or even communicate that the value should be immutable. An alternative workaround is const [value] = useState(initializer)
, but this is semantically wrong and more costly under the hood.
useConstCallback
function useConstCallback<T extends (...args: any[]) => any>(callback: T): T
Hook to ensure a callback function always has the same identity. Unlike React.useCallback
, this is guaranteed to always return the same value.
Its one parameter is the callback. Similar to useState
, only the first value/function passed in is respected.
If the callback should ever change based on dependencies, use React.useCallback
instead.
useConstCallback(fn)
has the same behavior as useConst(() => fn)
.
useId
function useId(prefix?: string): string
Hook to generate a unique ID (with optional prefix
) in the global scope. This will return the same ID on every render.
Useful for cases in which a component may be rendered multiple times on the same page and needs to use an ID for internal purposes, such as associating a label and an input.
Example
import { useId } from '@uifabric/react-hooks';
const TextField = ({ labelText, defaultValue }) => {
const id = useId('field');
return (
<div>
<label htmlFor={id}>{labelText}</label>
<input id={id} type="text" defaultValue={defaultValue} />
</div>
);
};
useBoolean
function useBoolean(initialState: boolean): [boolean, IUseBooleanCallbacks]
Hook to store a boolean state value and generate callbacks for setting the value to true or false, or toggling the value.
The hook returns a tuple containing the current value and an object with callbacks for updating the value.
IUseBooleanCallbacks
properties
setTrue: () => void
: Set the value to true. Always has the same identity.setFalse: () => void
: Set the value to false. Always has the same identity.toggle: () => void
: Toggle the value. If the value is currently true, this will be the setFalse
callback. If it's currently false, this will be the setTrue
callback.
Example
import { useBoolean } from '@uifabric/react-hooks';
const MyComponent = () => {
const [value, { setTrue: showDialog, setFalse: hideDialog, toggle: toggleDialogVisible }] = useBoolean(false);
};