Security News
GitHub Removes Malicious Pull Requests Targeting Open Source Repositories
GitHub removed 27 malicious pull requests attempting to inject harmful code across multiple open source repositories, in another round of low-effort attacks.
@fluentui/react-hooks
Advanced tools
@fluentui/react-hooks is a collection of React hooks provided by Fluent UI to help manage state, effects, and other common React patterns in a more efficient and reusable way.
useBoolean
The `useBoolean` hook provides a simple way to manage boolean state with helper functions to set the state to true or false.
const { useBoolean } = require('@fluentui/react-hooks');
function ExampleComponent() {
const [isOpen, { setTrue: open, setFalse: close }] = useBoolean(false);
return (
<div>
<button onClick={open}>Open</button>
<button onClick={close}>Close</button>
{isOpen && <div>Content is open</div>}
</div>
);
}
useConst
The `useConst` hook initializes and returns a constant value that remains the same across re-renders.
const { useConst } = require('@fluentui/react-hooks');
function ExampleComponent() {
const constantValue = useConst(() => ({ key: 'value' }));
return <div>{constantValue.key}</div>;
}
useId
The `useId` hook generates a unique ID that can be used for accessibility purposes or to uniquely identify elements.
const { useId } = require('@fluentui/react-hooks');
function ExampleComponent() {
const id = useId('example-id');
return <div id={id}>This div has a unique ID</div>;
}
The `react-use` package is a collection of essential React hooks that cover a wide range of use cases, from state management to lifecycle hooks. It offers a broader set of hooks compared to @fluentui/react-hooks, making it a more versatile choice for various scenarios.
The `ahooks` package is a library of React hooks that provides a comprehensive set of hooks for state management, side effects, and more. It is similar to @fluentui/react-hooks but offers additional hooks and utilities, making it a robust alternative for complex applications.
The `react-hooks-helper` package provides a set of utility hooks for common tasks like form handling, state management, and more. It is similar to @fluentui/react-hooks but focuses more on simplifying common patterns and tasks in React development.
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.
useCallback
that returns the same function reference every time, but always calls the latest implementation.useLayoutEffect
in browser and useEffect
in SSR, to avoid warnings.useEffect
with a dependency on a ref.setInterval
that automatically cleans up when component is unmounted.setTimeout
that automatically cleans up when component is unmounted.function useBoolean(initialState: boolean): [boolean, IUseBooleanCallbacks];
interface IUseBooleanCallbacks {
setTrue: () => void;
setFalse: () => void;
toggle: () => void;
}
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.
Each callback will always have the same identity.
import { useBoolean } from '@fluentui/react-hooks';
const MyComponent = () => {
const [value, { setTrue: showDialog, setFalse: hideDialog, toggle: toggleDialogVisible }] = useBoolean(false);
// ^^^ Instead of:
// const [isDialogVisible, setIsDialogVisible] = React.useState(false);
// const showDialog = React.useCallback(() => setIsDialogVisible(true), []);
// const hideDialog = React.useCallback(() => setIsDialogVisible(false), []);
// const toggleDialogVisible = isDialogVisible ? setFalse : setTrue;
// ... code that shows a dialog when a button is clicked ...
};
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.
import { useConst } from '@fluentui/react-hooks';
const MyComponent = () => {
const value = useConst(() => {
/* some computation that must only run once or has side effects */
});
const valueThatMustNeverChange = useConst(/*...*/);
...
};
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 withoutuseMemo
— 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.
// Without onChange
function useControllableValue<TValue, TElement extends HTMLElement>(
controlledValue: TValue | undefined,
defaultUncontrolledValue: TValue | undefined,
): Readonly<[TValue | undefined, (update: React.SetStateAction<TValue | undefined>) => void]>;
// With onChange
function useControllableValue<
TValue,
TElement extends HTMLElement,
TCallback extends ChangeCallback<TElement, TValue> | undefined,
>(
controlledValue: TValue | undefined,
defaultUncontrolledValue: TValue | undefined,
onChange: TCallback,
): Readonly<
[TValue | undefined, (update: React.SetStateAction<TValue | undefined>, ev: React.FormEvent<TElement>) => void]
>;
type ChangeCallback<TElement extends HTMLElement, TValue> = (
ev: React.FormEvent<TElement> | undefined,
newValue: TValue | undefined,
) => void;
Hook to manage the current value for a component that could be either controlled or uncontrolled, such as a checkbox or input field. (See the React docs about the distinction between controlled and uncontrolled components.)
Parameters:
controlledValue
(required): the current value if the component is controlleddefaultUncontrolledValue
(required): the default value if the component is uncontrolled (will not be used if controlledValue
is defined)onChange
(optional): callback to be notified of any changes triggered by the userThe returned value is an array with two elements:
onChange
callback if present.
React.useState
, the identity of this callback will never change.React.useState
, you can call this function with either a value, or an updater function which takes the previous value as a parameter and returns the new value.// The type parameters just copy the type of the passed function to the returned function
function useEventCallback<Args extends unknown[], Return>(fn: (...args: Args) => Return): (...args: Args) => Return;
Modified useCallback
that returns the same function reference every time, but internally calls the most-recently passed callback implementation. Can be useful in situations such as:
In general, prefer useCallback
unless you've encountered one of the problems above.
function useForceUpdate(): () => void;
Returns a function which, when called, will force update a function component by updating a fake state value.
The returned function always has the same identity.
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.
import { useId } from '@fluentui/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>
);
};
// Type is the same as React.useEffect (not fully specifying here)
function useIsomorphicLayoutEffect(effect, deps?): void;
To avoid warnings about useLayoutEffect
when server-side rendering, this calls useEffect
on the server (no-op) and useLayoutEffect
on the client. SSR is determined based on setSSR
from @fluentui/utilities
.
Prefer useEffect
unless you have a specific need to do something after mount and before paint.
function useMergedRefs<T>(...refs: React.Ref<T>[]): (instance: T) => void;
Hook to merge multiple refs (such as one passed in as a prop and one used locally) into a single ref callback that can be passed on to a child component.
const Example = React.forwardRef(function Example(props: {}, forwardedRef: React.Ref<HTMLDivElement>) {
const localRef = React.useRef<HTMLDivElement>();
const mergedRef = useMergedRef(localRef, forwardedRef);
React.useEffect(() => {
localRef.current.focus();
}, []);
return <div>Example</div>;
});
const useMount: (callback: () => void) => void;
Hook which asynchronously executes a callback once the component has been mounted using useEffect..
import { useMount } from '@fluentui/react-hooks';
const MyComponent = () => {
useMount(() => {
console.log('Example');
})
return <div />;
};
});
function useOnEvent<TElement extends Element, TEvent extends Event>(
element: React.RefObject<TElement | undefined | null> | TElement | Window | undefined | null,
eventName: string,
callback: (ev: TEvent) => void,
useCapture?: boolean,
): void;
Attach an event handler on mount and handle cleanup. The event handler is attached using on()
from @fluentui/utilities
.
function usePrevious<T>(value: T): T | undefined;
Hook keeping track of a given value from a previous execution of the component the Hook is used in. See React Hooks FAQ.
function useRefEffect<T>(callback: (value: T) => (() => void) | void, initial: T | null = null): RefCallback<T>;
type RefCallback<T> = ((value: T | null) => void) & React.RefObject<T>;
Creates a ref, and calls a callback whenever the ref changes to a non-null value. The callback can optionally return a cleanup function that'll be called before the value changes, and when the ref is unmounted.
The return value is a function that should be called to set the ref's value. The returned object also has a .current
member that can be used to access the ref's value (like a normal RefObject
). This can be hooked up to an element's ref
property.
useRefEffect
can be used to work around a limitation that useEffect
cannot depend on ref.current
.
import { useRefEffect } from '@fluentui/react-hooks';
const MyComponent = () => {
const myDivRef = useRefEffect<HTMLElement>(myDiv => {
const observer = new ResizeObserver(entries => {
console.log(`myDiv is ${entries[0].contentRect.width} px wide`);
});
observer.observe(myDiv);
// Return a function to clean up the ResizeObserver when the ref is unmounted
return () => observer.disconnect();
});
return <div ref={myDivRef} />;
};
function useSetInterval(): {
setInterval: (callback: () => void, duration: number) => number;
clearInterval: (id: number) => void;
};
Hook which returns safe setInterval
and clearInterval
methods. Intervals set up using this hook will be automatically cleared when the component is unmounted.
The returned callbacks always have the same identity.
import { useSetInterval } from '@fluentui/react-hooks';
const MyComponent = () => {
const { setInterval, clearInterval } = useSetInterval();
// Set an interval
const id = setInterval(() => console.log('test'), 500);
// If needed, clear an interval manually.
clearInterval(id);
};
function useSetTimeout(): {
setTimeout: (callback: () => void, duration: number) => number;
clearTimeout: (id: number) => void;
};
Hook which returns safe setTimeout
and clearTimeout
methods. Timeout callbacks set up using this hook will be automatically cleared when the component is unmounted.
The returned callbacks always have the same identity.
import { useSetTimeout } from '@fluentui/react-hooks';
const MyComponent = () => {
const { setTimeout, clearTimeout } = useSetTimeout();
// Set a timeout
const id = setTimeout(() => console.log('test'), 500);
// If needed, clear an timeout manually.
clearTimeout(id);
};
type Target = Element | string | MouseEvent | Point | null | React.RefObject<Element>;
function useTarget<TElement extends HTMLElement = HTMLElement>(
target: Target | undefined,
hostElement?: React.RefObject<TElement | null>,
): Readonly<[React.RefObject<Element | MouseEvent | Point | null>, React.RefObject<Window | undefined>]>;
Hook which queries the document for the element indicated by a CSS query string (if provided), or returns the element/event/point provided. Also attempts to determine the Window object for the provided target.
const useUnmount: (callback: () => void) => void;
Hook that asynchronously fires a callback during unmount using useEffect.
import { useUnmount } from '@fluentui/react-hooks';
const MyComponent = () => {
useUnmount(() => {
console.log('Example');
});
return <div />;
};
function useWarnings<P>(options: IWarningOptions<P>): void;
Display console warnings when certain conditions are met. If using webpack, the warning code will automatically be stripped out in production mode.
The following types of warnings are supported (see typings for details on how to specify all of these):
other
: Generic string messages.conditionallyRequired
: Warns about props that are required if a condition is met.deprecations
: Warns when deprecated props are being used.mutuallyExclusive
: Warns when two props which are mutually exclusive are both being used.controlledUsage
: Warns on any of the following error conditions in a form component (mimicking the warnings React gives for these error conditions on an input element):
Note that all warnings except controlledUsage
will only be shown on first render. New controlledUsage
warnings may be shown later based on prop changes. All warnings are shown synchronously during render (not wrapped in useEffect
) for easier tracing/debugging.
FAQs
Fluent UI React hooks.
The npm package @fluentui/react-hooks receives a total of 85,839 weekly downloads. As such, @fluentui/react-hooks popularity was classified as popular.
We found that @fluentui/react-hooks demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 12 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
GitHub removed 27 malicious pull requests attempting to inject harmful code across multiple open source repositories, in another round of low-effort attacks.
Security News
RubyGems.org has added a new "maintainer" role that allows for publishing new versions of gems. This new permission type is aimed at improving security for gem owners and the service overall.
Security News
Node.js will be enforcing stricter semver-major PR policies a month before major releases to enhance stability and ensure reliable release candidates.