useRange()
This is the React InstantSearch v7 documentation. React InstantSearch v7 is the latest version of React InstantSearch and the stable version of React InstantSearch Hooks.
If you were using React InstantSearch v6, you can upgrade to v7.
If you were using React InstantSearch Hooks, you can still use the React InstantSearch v7 documentation, but you should check the upgrade guide for necessary changes.
If you want to keep using React InstantSearch v6, you can find the archived documentation.
1
import { useRange } from 'react-instantsearch';
About this Hook
React Hook to filter search results within a numeric range. With this Hook, you can build your own slider components.
The Examples section includes examples for two popular React UI components libraries.
To display an input for a range of numbers, use the <RangeInput>
widget instead.
Requirements
The attribute
must be set as an attribute for faceting.
You can do that in the dashboard
or with the API.
Examples
Range slider with React Spectrum
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
import React, { useState, useEffect } from "react";
import { useRange } from 'react-instantsearch';
import { RangeSlider as SpectrumRangeSlider } from '@adobe/react-spectrum';
// …
export function RangeSlider(props) {
const { start, range, canRefine, refine } = useRange(props);
const { min, max } = range;
const [value, setValue] = useState({ start: min, end: max });
const from = Math.max(min, Number.isFinite(start[0]) ? start[0] : min);
const to = Math.min(max, Number.isFinite(start[1]) ? start[1] : max);
useEffect(() => {
setValue({ start: from, end: to });
}, [from, to]);
return (
<SpectrumRangeSlider
label="Price range"
minValue={min}
maxValue={max}
value={value}
onChange={setValue}
onChangeEnd={({ start, end }) => refine([start, end])}
isDisabled={!canRefine}
/>
);
}
Range slider with Radix UI
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
import React, { useState, useEffect } from "react";
import { useRange } from 'react-instantsearch';
import * as Slider from '@radix-ui/react-slider';
// …
export function RangeSlider(props) {
const { start, range, canRefine, refine } = useRange(props);
const { min, max } = range;
const [value, setValue] = useState([min, max]);
const from = Math.max(min, Number.isFinite(start[0]) ? start[0] : min);
const to = Math.min(max, Number.isFinite(start[1]) ? start[1] : max);
useEffect(() => {
setValue([from, to]);
}, [from, to]);
return (
<Slider.Root
min={min}
max={max}
value={value}
onValueChange={setValue}
onValueCommit={refine}
disabled={!canRefine}
>
<Slider.Track>
<Slider.Range />
</Slider.Track>
<Slider.Thumb />
<Slider.Thumb />
</Slider.Root>
);
}
Parameters
Parameter | Description | ||
---|---|---|---|
attribute
|
type: string
Required
The name of a numeric attribute in your Algolia records which should be used for refining the search. |
||
Copy
|
|||
min
|
type: number
Optional
The minimum value for the input. When not provided, Algolia determines the minimum from the values of the attribute you specified in the |
||
Copy
|
|||
max
|
type: number
Optional
The maximum value for the input. When not provided, Algolia determines the maximum from the values of the attribute you specified in the |
||
Copy
|
|||
precision
|
type: number
default: 0
Optional
The number of digits after the decimal point to use. Use a negative value to round values to powers of 10. For example, a precision of -2 would round a number to the nearest hundred, while a precision of -3 would round it to the nearest thousand. |
||
Copy
|
Returns
Parameter | Description |
---|---|
start
|
type: [number, number]
The selected range for the refinement, with |
range
|
type: { min: number, max: number }
The highest and lowest possible bounds for the range. |
canRefine
|
type: boolean
Whether the search can be refined. |
refine
|
type: (range: [number, number]) => void
Sets a range to filter the results on. Both values are optional, and default to the higher and lower bounds. You can use |
sendEvent
|
type: (eventType: string, facetValue: string, eventName?: string) => void
Sends an event to the Insights API. |