<InfiniteHits>
<InfiniteHits // Optional props hitComponent={({ hit }) => JSX.Element} showPrevious={boolean} transformItems={function} cache={object} classNames={object} translations={object} ...props={ComponentProps<'div'>} />
1
import { InfiniteHits } from 'react-instantsearch-hooks-web';
About this widget
The <InfiniteHits>
widget displays a list of results with a “Show more” button at the bottom of the list. As an alternative to this approach, the infinite scroll guide describes how to create an automatically-scrolling infinite hits experience.
If there are no hits, you should display a message to users and clear filters so they can start over.
You can also create your own UI with
useInfiniteHits()
.
Examples
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import React from 'react';
import algoliasearch from 'algoliasearch/lite';
import { InstantSearch, InfiniteHits } from 'react-instantsearch-hooks-web';
const searchClient = algoliasearch('YourApplicationID', 'YourSearchOnlyAPIKey');
function Hit({ hit }) {
return JSON.stringify(hit);
}
function App() {
return (
<InstantSearch indexName="instant_search" searchClient={searchClient}>
<InfiniteHits hitComponent={Hit} />
</InstantSearch>
);
}
Props
hitComponent
|
type: (props: { hit: THit; sendEvent: SendEventForHits }) => JSX.Element
Required
A component that renders each hit from the results. It receives a When not provided, the widget displays the hit as a JSON string. |
||
Copy
|
|||
showPrevious
|
type: boolean
default: true
Optional
Enable the button to load previous results. |
||
Copy
|
|||
escapeHTML
|
type: boolean
default: true
Optional
Whether to escape HTML tags from hits string values. |
||
Copy
|
|||
transformItems
|
type: (items: object[], metadata: { results: SearchResults }) => object[]
Optional
Receives the items and is called before displaying them. It returns a new array with the same “shape” as the original. This is helpful when transforming, removing, or reordering items. The complete If you’re transforming an attribute with the |
||
Copy
|
|||
cache
|
type: InfiniteHitsCache
Optional
The widget caches all loaded hits. By default, it uses its own internal in-memory cache implementation. Alternatively, use You can also implement your own cache object with |
||
Copy
|
|||
classNames
|
type: Partial<InfiniteHitsClassNames>
Optional
CSS classes to pass to the widget’s elements. This helps when styling widgets with class-based CSS frameworks like Bootstrap or Tailwind CSS.
|
||
Copy
|
|||
translations
|
type: Partial<InfiniteHitsTranslations>
Optional
A dictionary of translations to customize the UI text and support internationalization.
|
||
Copy
|
|||
...props
|
type: React.ComponentProps<'div'>
Optional
Any |
||
Copy
|
Hook
React InstantSearch Hooks let you create your own UI for the <InfiniteHits>
widget with useInfiniteHits()
. Hooks provide APIs to access the widget state and interact with InstantSearch.
The useInfiniteHits()
Hook accepts parameters and returns APIs.
Usage
First, create your React component:
import { useInfiniteHits } from 'react-instantsearch-hooks-web';
function CustomInfiniteHits(props) {
const {
hits,
currentPageHits,
results,
isFirstPage,
isLastPage,
showPrevious,
showMore,
sendEvent,
} = useInfiniteHits(props);
return <>{/* Your JSX */}</>;
}
Then, render the widget:
<CustomInfiniteHits {...props} />
Parameters
Hooks accept parameters. You can pass them manually, or forward the props from your custom component.
When you provide a function to Hooks, make sure to pass a stable reference to avoid rendering endlessly (for example, with useCallback()
). Objects and arrays are memoized; you don’t need to stabilize them.
escapeHTML
|
type: boolean
default: true
Whether to escape HTML tags from hits string values. |
||
Copy
|
|||
transformItems
|
type: (items: object[], metadata: { results: SearchResults }) => object[]
Receives the items and is called before displaying them. Should return a new array with the same shape as the original array. Useful for transforming, removing, or reordering items. The complete If you’re transforming an attribute with the |
||
Copy
|
|||
cache
|
type: InfiniteHitsCache
The Hook internally caches all loaded hits using its own internal in-memory cache implementation. The library provides another implementation using You can also provide your own implementation by providing a cache object with |
||
Copy
|
APIs
Hooks return APIs, such as state and functions. You can use them to build your UI and interact with React InstantSearch.
hits
|
type: THit[]
The matched hits returned from Algolia. This returns the combined hits for all the pages that have been requested so far. Use Algolia’s highlighting feature directly from the render function. |
currentPageHits
|
type: THit[]
The matched hits from Algolia for the current page. Unlike the You can use Algolia’s highlighting feature directly from the render function. |
results
|
type: SearchResults<THit>
The complete response from Algolia. It contains the |
isFirstPage
|
type: boolean
Whether the first page of hits has been reached. |
isLastPage
|
type: boolean
Whether the last page of hits has been reached. |
showPrevious
|
type: () => void
Loads the previous page of hits. |
showMore
|
type: () => void
Loads the next page of hits. |
sendEvent
|
type: (eventType: string, hits: Hit | Hits, eventName?: string) => void
The function to send The |
Example
1
2
3
4
5
6
7
8
import React from 'react';
import { useInfiniteHits } from 'react-instantsearch-hooks-web';
function CustomInfiniteHits(props) {
const { hits, isLastPage, showMore } = useInfiniteHits(props);
return <>{/* Your JSX */}</>;
}
Click and conversion events
If the insights
option is true
, the InfiniteHits
component automatically sends a click
event with the following “shape” to the Insights API whenever the user clicks on a hit.
1
2
3
4
5
6
7
8
9
{
eventType: 'click',
insightsMethod: 'clickedObjectIDsAfterSearch',
payload: {
eventName: 'Hit Clicked',
// …
},
widgetType: 'ais.infiniteHits',
}
To customize this event, use the sendEvent
function in your hitComponent
and send a custom click
event.
1
2
3
4
5
6
7
8
9
10
<InfiniteHits
hitComponent={({ hit, sendEvent }) => (
<div onClick={() => sendEvent("click", hit, "Product Clicked")}>
<h2>
<Highlight attributeName="name" hit={hit} />
</h2>
<p>{hit.description}</p>
</div>
)}
/>;