Skip to content

Latest commit

 

History

History

compose

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 

Compose

The compose package is a collection of handy Hooks and Higher Order Components (HOCs) you can use to wrap your WordPress components and provide some basic features like: state, instance id, pure...

The compose function is an alias to flowRight from Lodash. It comes from functional programming, and allows you to compose any number of functions. You might also think of this as layering functions; compose will execute the last function first, then sequentially move back through the previous functions passing the result of each function upward.

An example that illustrates it for two functions:

const compose = ( f, g ) => x
    => f( g( x ) );

Here's a simplified example of compose in use from Gutenberg's PluginSidebar component:

Using compose:

const applyWithSelect = withSelect( ( select, ownProps ) => {
	return doSomething( select, ownProps);
} );
const applyWithDispatch = withDispatch( ( dispatch, ownProps ) => {
	return doSomethingElse( dispatch, ownProps );
} );

export default compose(
	withPluginContext,
	applyWithSelect,
	applyWithDispatch,
)( PluginSidebarMoreMenuItem );

Without compose, the code would look like this:

const applyWithSelect = withSelect( ( select, ownProps ) => {
	return doSomething( select, ownProps);
} );
const applyWithDispatch = withDispatch( ( dispatch, ownProps ) => {
	return doSomethingElse( dispatch, ownProps );
} );

export default withPluginContext(
	applyWithSelect(
		applyWithDispatch(
			PluginSidebarMoreMenuItem
		)
	)
);

Installation

Install the module

npm install @wordpress/compose --save

This package assumes that your code will run in an ES2015+ environment. If you're using an environment that has limited or no support for ES2015+ such as lower versions of IE then using core-js or @babel/polyfill will add support for these methods. Learn more about it in Babel docs.

API

For more details, you can refer to each Higher Order Component's README file. Available components are located here.

# compose

Composes multiple higher-order components into a single higher-order component. Performs right-to-left function composition, where each successive invocation is supplied the return value of the previous.

Parameters

  • hocs ...Function: The HOC functions to invoke.

Returns

  • Function: Returns the new composite function.

# createHigherOrderComponent

Given a function mapping a component to an enhanced component and modifier name, returns the enhanced component augmented with a generated displayName.

Parameters

  • mapComponentToEnhancedComponent Function: Function mapping component to enhanced component.
  • modifierName string: Seed name from which to generated display name.

Returns

  • WPComponent: Component class with generated display name assigned.

# ifCondition

Higher-order component creator, creating a new component which renders if the given condition is satisfied or with the given optional prop name.

Parameters

  • predicate Function: Function to test condition.

Returns

  • Function: Higher-order component.

# pure

Given a component returns the enhanced component augmented with a component only rerendering when its props/state change

Parameters

  • mapComponentToEnhancedComponent Function: Function mapping component to enhanced component.
  • modifierName string: Seed name from which to generated display name.

Returns

  • WPComponent: Component class with generated display name assigned.

# useAsyncList

React hook returns an array which items get asynchronously appended from a source array. This behavior is useful if we want to render a list of items asynchronously for performance reasons.

Parameters

  • list Array: Source array.

Returns

  • Array: Async array.

# useConstrainedTabbing

In Dialogs/modals, the tabbing must be constrained to the content of the wrapper element. This hook adds the behavior to the returned ref.

Usage

import { useConstrainedTabbing } from '@wordpress/compose';

const ConstrainedTabbingExample = () => {
    const constrainedTabbingRef = useConstrainedTabbing()
    return (
        <div ref={ constrainedTabbingRef }>
            <Button />
            <Button />
        </div>
    );
}

Returns

  • (Object|Function): Element Ref.

# useCopyOnClick

Copies the text to the clipboard when the element is clicked.

Parameters

  • ref Object: Reference with the element.
  • text (string|Function): The text to copy.
  • timeout number: Optional timeout to reset the returned state. 4 seconds by default.

Returns

  • boolean: Whether or not the text has been copied. Resets after the timeout.

# useDebounce

Debounces a function with Lodash's debounce. A new debounced function will be returned and any scheduled calls cancelled if any of the arguments change, including the function to debounce, so please wrap functions created on render in components in useCallback.

Parameters

  • args ...any: Arguments passed to Lodash's debounce.

Returns

  • Function: Debounced function.

# useFocusOnMount

Hook used to focus the first tabbable element on mount.

Usage

import { useFocusOnMount } from '@wordpress/compose';

const WithFocusOnMount = () => {
    const ref = useFocusOnMount()
    return (
        <div ref={ ref }>
            <Button />
            <Button />
        </div>
    );
}

Parameters

  • focusOnMount (boolean|string): Focus on mount mode.

Returns

  • Function: Ref callback.

# useFocusReturn

When opening modals/sidebars/dialogs, the focus must move to the opened area and return to the previously focused element when closed. The current hook implements the returning behavior.

Usage

import { useFocusReturn } from '@wordpress/compose';

const WithFocusReturn = () => {
    const ref = useFocusReturn()
    return (
        <div ref={ ref }>
            <Button />
            <Button />
        </div>
    );
}

Parameters

  • onFocusReturn ?Function: Overrides the default return behavior.

Returns

  • Function: Element Ref.

# useInstanceId

Provides a unique instance ID.

Parameters

  • object Object: Object reference to create an id for.
  • prefix string: Prefix for the unique id.

# useKeyboardShortcut

Attach a keyboard shortcut handler.

Parameters

  • shortcuts (Array<string>|string): Keyboard Shortcuts.
  • callback Function: Shortcut callback.
  • options WPKeyboardShortcutConfig: Shortcut options.

# useMediaQuery

Runs a media query and returns its value when it changes.

Parameters

  • query [string]: Media Query.

Returns

  • boolean: return value of the media query.

# usePrevious

Use something's value from the previous render. Based on https://usehooks.com/usePrevious/.

Parameters

  • value T: The value to track.

Returns

  • (T|undefined): The value from the previous render.

# useReducedMotion

Hook returning whether the user has a preference for reduced motion.

Returns

  • boolean: Reduced motion preference value.

# useResizeObserver

Hook which allows to listen the resize event of any target element when it changes sizes. Note: useResizeObserver will report null until after first render

Usage

const App = () => {
	const [ resizeListener, sizes ] = useResizeObserver();

	return (
		<div>
			{ resizeListener }
			Your content here
		</div>
	);
};

Returns

  • Array: An array of {Element} resizeListener and {?Object} sizes with properties width and height

# useThrottle

Throttles a function with Lodash's throttle. A new throttled function will be returned and any scheduled calls cancelled if any of the arguments change, including the function to throttle, so please wrap functions created on render in components in useCallback.

Parameters

  • args ...any: Arguments passed to Lodash's throttle.

Returns

  • Function: Throttled function.

# useViewportMatch

Returns true if the viewport matches the given query, or false otherwise.

Usage

useViewportMatch( 'huge', '<' );
useViewportMatch( 'medium' );

Parameters

  • breakpoint WPBreakpoint: Breakpoint size name.
  • operator [WPViewportOperator]: Viewport operator.

Returns

  • boolean: Whether viewport matches query.

# useWarnOnChange

Hook that performs a shallow comparison between the preview value of an object and the new one, if there's a difference, it prints it to the console. this is useful in performance related work, to check why a component re-renders.

Usage

function MyComponent(props) {
   useWarnOnChange(props);

   return "Something";
}

Parameters

  • object Object: Object which changes to compare.
  • prefix string: Just a prefix to show when console logging.

# withGlobalEvents

Deprecated

Higher-order component creator which, given an object of DOM event types and values corresponding to a callback function name on the component, will create or update a window event handler to invoke the callback when an event occurs. On behalf of the consuming developer, the higher-order component manages unbinding when the component unmounts, and binding at most a single event handler for the entire application.

Parameters

  • eventTypesToHandlers Object<string,string>: Object with keys of DOM event type, the value a name of the function on the original component's instance which handles the event.

Returns

  • Function: Higher-order component.

# withInstanceId

A Higher Order Component used to be provide a unique instance ID by component.

Parameters

  • WrappedComponent WPComponent: The wrapped component.

Returns

  • WPComponent: Component with an instanceId prop.

# withSafeTimeout

A higher-order component used to provide and manage delayed function calls that ought to be bound to a component's lifecycle.

Parameters

  • OriginalComponent WPComponent: Component requiring setTimeout

Returns

  • WPComponent: Wrapped component.

# withState

A Higher Order Component used to provide and manage internal component state via props.

Parameters

  • initialState ?Object: Optional initial state of the component.

Returns

  • WPComponent: Wrapped component.



Code is Poetry.