--- title: (<>...) --- ``, often used via `<>...` syntax, lets you group elements without a wrapper node. Fragments can also accept refs, which enable interacting with underlying DOM nodes without adding wrapper elements. See reference and usage below. ```js <> ``` --- ## Reference {/*reference*/} ### `` {/*fragment*/} Wrap elements in `` to group them together in situations where you need a single element. Grouping elements in `Fragment` has no effect on the resulting DOM; it is the same as if the elements were not grouped. The empty JSX tag `<>` is shorthand for `` in most cases. #### Props {/*props*/} - **optional** `key`: Fragments declared with the explicit `` syntax may have [keys.](/learn/rendering-lists#keeping-list-items-in-order-with-key) - **optional** `ref`: A ref object (e.g. from [`useRef`](/reference/react/useRef)) or [callback function](/reference/react-dom/components/common#ref-callback). React provides a `FragmentInstance` as the ref value that implements methods for interacting with the DOM nodes wrapped by the Fragment. ### FragmentInstance {/*fragmentinstance*/} When you pass a ref to a fragment, React provides a `FragmentInstance` object with methods for interacting with the DOM nodes wrapped by the fragment: **Event handling methods:** - `addEventListener(type, listener, options?)`: Adds an event listener to all first-level DOM children of the Fragment. - `removeEventListener(type, listener, options?)`: Removes an event listener from all first-level DOM children of the Fragment. - `dispatchEvent(event)`: Dispatches an event to a virtual child of the Fragment to call any added listeners and can bubble to the DOM parent. **Layout methods:** - `compareDocumentPosition(otherNode)`: Compares the document position of the Fragment with another node. - If the Fragment has children, the native `compareDocumentPosition` value is returned. - Empty Fragments will attempt to compare positioning within the React tree and include `Node.DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC`. - Elements that have a different relationship in the React tree and DOM tree due to portaling or other insertions are `Node.DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC`. - `getClientRects()`: Returns a flat array of `DOMRect` objects representing the bounding rectangles of all children. - `getRootNode()`: Returns the root node containing the Fragment's parent DOM node. **Focus management methods:** - `focus(options?)`: Focuses the first focusable DOM node in the Fragment. Focus is attempted on nested children depth-first. - `focusLast(options?)`: Focuses the last focusable DOM node in the Fragment. Focus is attempted on nested children depth-first. - `blur()`: Removes focus if `document.activeElement` is within the Fragment. **Observer methods:** - `observeUsing(observer)`: Starts observing the Fragment's DOM children with an IntersectionObserver or ResizeObserver. - `unobserveUsing(observer)`: Stops observing the Fragment's DOM children with the specified observer. #### Caveats {/*caveats*/} - If you want to pass `key` to a Fragment, you can't use the `<>...` syntax. You have to explicitly import `Fragment` from `'react'` and render `...`. - React does not [reset state](/learn/preserving-and-resetting-state) when you go from rendering `<>` to `[]` or back, or when you go from rendering `<>` to `` and back. This only works a single level deep: for example, going from `<><>` to `` resets the state. See the precise semantics [here.](https://gist.github.com/clemmy/b3ef00f9507909429d8aa0d3ee4f986b) - If you want to pass `ref` to a Fragment, you can't use the `<>...` syntax. You have to explicitly import `Fragment` from `'react'` and render `...`. --- ## Usage {/*usage*/} ### Returning multiple elements {/*returning-multiple-elements*/} Use `Fragment`, or the equivalent `<>...` syntax, to group multiple elements together. You can use it to put multiple elements in any place where a single element can go. For example, a component can only return one element, but by using a Fragment you can group multiple elements together and then return them as a group: ```js {3,6} function Post() { return ( <> ); } ``` Fragments are useful because grouping elements with a Fragment has no effect on layout or styles, unlike if you wrapped the elements in another container like a DOM element. If you inspect this example with the browser tools, you'll see that all `

` and `
` DOM nodes appear as siblings without wrappers around them: ```js export default function Blog() { return ( <> ) } function Post({ title, body }) { return ( <> ); } function PostTitle({ title }) { return

{title}

} function PostBody({ body }) { return (

{body}

); } ```
#### How to write a Fragment without the special syntax? {/*how-to-write-a-fragment-without-the-special-syntax*/} The example above is equivalent to importing `Fragment` from React: ```js {1,5,8} import { Fragment } from 'react'; function Post() { return ( ); } ``` Usually you won't need this unless you need to [pass a `key` to your `Fragment`.](#rendering-a-list-of-fragments) --- ### Assigning multiple elements to a variable {/*assigning-multiple-elements-to-a-variable*/} Like any other element, you can assign Fragment elements to variables, pass them as props, and so on: ```js function CloseDialog() { const buttons = ( <> ); return ( Are you sure you want to leave this page? ); } ``` --- ### Grouping elements with text {/*grouping-elements-with-text*/} You can use `Fragment` to group text together with components: ```js function DateRangePicker({ start, end }) { return ( <> From to ); } ``` --- ### Rendering a list of Fragments {/*rendering-a-list-of-fragments*/} Here's a situation where you need to write `Fragment` explicitly instead of using the `<>` syntax. When you [render multiple elements in a loop](/learn/rendering-lists), you need to assign a `key` to each element. If the elements within the loop are Fragments, you need to use the normal JSX element syntax in order to provide the `key` attribute: ```js {3,6} function Blog() { return posts.map(post => ); } ``` You can inspect the DOM to verify that there are no wrapper elements around the Fragment children: ```js import { Fragment } from 'react'; const posts = [ { id: 1, title: 'An update', body: "It's been a while since I posted..." }, { id: 2, title: 'My new blog', body: 'I am starting a new blog!' } ]; export default function Blog() { return posts.map(post => ); } function PostTitle({ title }) { return

{title}

} function PostBody({ body }) { return (

{body}

); } ```
--- ### Using Fragment refs for DOM interaction {/*using-fragment-refs-for-dom-interaction*/} Fragment refs allow you to interact with the DOM nodes wrapped by a Fragment without adding extra wrapper elements. This is useful for event handling, visibility tracking, focus management, and replacing deprecated patterns like `ReactDOM.findDOMNode()`. ```js import { Fragment } from 'react'; function ClickableFragment({ children, onClick }) { return ( { fragmentInstance.addEventListener('click', handleClick); return () => fragmentInstance.removeEventListener('click', handleClick); }}> {children} ); } ``` --- ### Tracking visibility with Fragment refs {/*tracking-visibility-with-fragment-refs*/} Fragment refs are useful for visibility tracking and intersection observation. This enables you to monitor when content becomes visible without requiring the child Components to expose refs: ```js {19,21,31-34} import { Fragment, useRef, useLayoutEffect } from 'react'; function VisibilityObserverFragment({ threshold = 0.5, onVisibilityChange, children }) { const fragmentRef = useRef(null); useLayoutEffect(() => { const observer = new IntersectionObserver( (entries) => { onVisibilityChange(entries.some(entry => entry.isIntersecting)) }, { threshold } ); fragmentRef.current.observeUsing(observer); return () => fragmentRef.current.unobserveUsing(observer); }, [threshold, onVisibilityChange]); return ( {children} ); } function MyComponent() { const handleVisibilityChange = (isVisible) => { console.log('Component is', isVisible ? 'visible' : 'hidden'); }; return ( ); } ``` This pattern is an alternative to Effect-based visibility logging, which is an anti-pattern in most cases. Relying on Effects alone does not guarantee that the rendered Component is observable by the user. --- ### Focus management with Fragment refs {/*focus-management-with-fragment-refs*/} Fragment refs provide focus management methods that work across all DOM nodes within the Fragment: ```js import { Fragment, useRef } from 'react'; function FocusFragment({ children }) { const fragmentRef = useRef(null); return ( fragmentInstance?.focus()}> {children} ); } ``` The `focus()` method focuses the first focusable element within the Fragment, while `focusLast()` focuses the last focusable element.