RefinementList
<RefinementList attribute={string} // Optional parameters defaultRefinement={string[]} operator={string} limit={number} showMore={boolean} showMoreLimit={number} searchable={boolean} transformItems={function} translations={object} />
About this widget
The RefinementList
widget is one of the most common widgets that you can find in a search UI. With this widget, the user can filter the dataset based on facet values.
The widget only displays the most relevant facets for the current search context. The sort option only affects the facets that are returned by the engine, not which facets are returned.
This widget also implements search for facet values, which is a mini search inside the values of the facets. This makes it easy to deal with uncommon facet values.
Requirements
The attribute provided to the widget must be added in attributes for faceting, either on the dashboard or using attributesForFaceting with the API.
If you are using the searchable
prop, you also need to make the attribute searchable using the dashboard or using the searchable
modifier of attributesForFaceting with the API.
Examples
1
2
3
import { RefinementList } from 'react-instantsearch-dom';
<RefinementList attribute="brand" />
Props
attribute
|
type: string
Required
The name of the attribute in the record. |
||
Copy
|
|||
defaultRefinement
|
type: string[]
Optional
The value of the item selected by default. |
||
Copy
|
|||
operator
|
type: string ("or"|"and")
default: or
Optional
How to apply the refinements. |
||
Copy
|
|||
limit
|
type: number
default: 10
Optional
The minimum number of facet values to retrieve. |
||
Copy
|
|||
showMore
|
type: boolean
default: false
Optional
Whether to display a button that expands the number of items. |
||
Copy
|
|||
showMoreLimit
|
type: number
default: 20
Optional
The maximum number of displayed items. Only used when |
||
Copy
|
|||
searchable
|
type: boolean
Optional
Whether to add a search input to let the user search for more facet values. To make this feature work, you need to make the attribute searchable using the dashboard or using the |
||
Copy
|
|||
transformItems
|
type: function
Optional
Modifies the items being displayed, for example, to filter or sort them. It takes items as argument and expects them back in return. |
||
Copy
|
|||
translations
|
type: object
Optional
A mapping of keys to translation values.
|
||
Copy
|
Customize the UI - connectRefinementList
If you want to create your own UI of the RefinementList
widget or use another UI library, you can use connectors.
Connectors are higher-order components. They encapsulate the logic for a specific kind of widget and they provide a way to interact with the InstantSearch context.
They have an outer component API that we call exposed props, and they provide some other props to the wrapped components which are called the provided props.
It’s a 3-step process:
// 1. Create a React component
const RefinementList = () => {
// return the DOM output
};
// 2. Connect the component using the connector
const CustomRefinementList = connectRefinementList(RefinementList);
// 3. Use your connected widget
<CustomRefinementList />
Create a React component
const RefinementList = ({
object[] items,
string[] currentRefinement,
function refine,
boolean isFromSearch,
function searchForItems,
function createURL,
}) => {
// return the DOM output
};
Provided Props
items
|
type: object[]
The list of items the with can display, with each item:
|
||
Copy
|
|||
currentRefinement
|
type: string[]
The currently applied refinement. |
||
Copy
|
|||
refine
|
type: function
Toggles a refinement. |
||
Copy
|
|||
isFromSearch
|
type: boolean
Whether the provided |
||
Copy
|
|||
searchForItems
|
type: function
Triggers a search inside items values. |
||
Copy
|
|||
createURL
|
type: function
Generates a URL for the corresponding search state. |
||
Copy
|
Create and instantiate your connected widget
const CustomRefinementList = connectRefinementList(RefinementList);
<CustomRefinementList
attribute={string}
// optional parameters
defaultRefinement={string[]}
operator={string}
limit={number}
showMore={boolean}
showMoreLimit={number}
searchable={boolean}
transformItems={function}
/>
Exposed Props
attribute
|
type: string
Required
The name of the attribute in the record. |
||
Copy
|
|||
defaultRefinement
|
type: string[]
Optional
The value of the item selected by default. |
||
Copy
|
|||
operator
|
type: string ("or"|"and")
default: or
Optional
How to apply the refinements. |
||
Copy
|
|||
limit
|
type: number
default: 10
Optional
The minimum number of diplayed items. |
||
Copy
|
|||
showMore
|
type: boolean
default: false
Optional
We don’t expose the function to toggle the number of value displayed by the widget with the connector. Yet, the option is required to enable the “Show more” behavior. The option drives how many values are retrieved (either |
||
Copy
|
|||
showMoreLimit
|
type: number
default: 20
Optional
The maximum number of displayed items. Only used when |
||
Copy
|
|||
searchable
|
type: boolean
Optional
With the connector, it’s your responsability to render the To make this feature work, you need to make the attribute searchable using the dashboard or using the |
||
Copy
|
|||
transformItems
|
type: function
Optional
Modifies the items being displayed, for example, to filter or sort them. It takes items as argument and expects them back in return. |
||
Copy
|
Full example
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import { Highlight, connectRefinementList } from 'react-instantsearch-dom';
const RefinementList = ({
items,
isFromSearch,
refine,
searchForItems,
createURL,
}) => (
<ul>
<li>
<input
type="search"
onChange={event => searchForItems(event.currentTarget.value)}
/>
</li>
{items.map(item => (
<li key={item.label}>
<a
href={createURL(item.value)}
style={{ fontWeight: item.isRefined ? 'bold' : '' }}
onClick={event => {
event.preventDefault();
refine(item.value);
}}
>
{isFromSearch ? (
<Highlight attribute="label" hit={item} />
) : (
item.label
)}{' '}
({item.count})
</a>
</li>
))}
</ul>
);
const CustomRefinementList = connectRefinementList(RefinementList);
HTML output
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<div class="ais-RefinementList">
<div class="ais-RefinementList-searchBox">
<!-- SearchBox widget here -->
</div>
<ul class="ais-RefinementList-list">
<li class="ais-RefinementList-item ais-RefinementList-item--selected">
<label class="ais-RefinementList-label">
<input class="ais-RefinementList-checkbox" type="checkbox" value="Insignia™" checked="" />
<span class="ais-RefinementList-labelText">Insignia™</span>
<span class="ais-RefinementList-count">746</span>
</label>
</li>
<li class="ais-RefinementList-item">
<label class="ais-RefinementList-label">
<input class="ais-RefinementList-checkbox" type="checkbox" value="Samsung">
<span class="ais-RefinementList-labelText">Samsung</span>
<span class="ais-RefinementList-count">633</span>
</label>
</li>
</ul>
<button class="ais-RefinementList-showMore">Show more</button>
</div>