stats
instantsearch.widgets.stats({ container: string|HTMLElement, // Optional parameters templates: object, cssClasses: object, });
About this widget # A
The stats
widget displays the total number of matching hits and the time it took to get them (time spent in the Algolia server).
Examples # A
1
2
3
instantsearch.widgets.stats({
container: '#stats',
});
Options # A
container
# |
type: string|HTMLElement
Required
The CSS Selector or |
||
Copy
|
|||
templates
# |
type: object
Optional
The templates to use for the widget. |
||
Copy
|
|||
cssClasses
# |
type: object
default: {}
Optional
The CSS classes to override.
|
||
Copy
|
Templates # A
text
# |
type: string|function
Optional
The template to use to customize the text. It exposes:
|
||
Copy
|
HTML output# A
1
2
3
4
5
6
7
8
9
<div class="ais-Stats">
<span class="ais-Stats-text">7,435 relevant results sorted out of 20,337 found in 1ms.</span>
</div>
<!-- or -->
<div class="ais-Stats">
<span class="ais-Stats-text">20,337 results found in 1ms.</span>
</div>
Customize the UI with connectStats# A
If you want to create your own UI of the stats
widget, you can use connectors.
It’s a 3-step process:
// 1. Create a render function
const renderStats = (renderOptions, isFirstRender) => {
// Rendering logic
};
// 2. Create the custom widget
const customStats = instantsearch.connectors.connectStats(
renderStats
);
// 3. Instantiate
search.addWidgets([
customStats({
// instance params
})
]);
Create a render function#
This rendering function is called before the first search (init
lifecycle step)
and each time results come back from Algolia (render
lifecycle step).
const renderStats = (renderOptions, isFirstRender) => {
const {
number hitsPerPage,
number nbHits,
boolean areHitsSorted,
number nbSortedHits,
number nbPages,
number page,
number processingTimeMS,
string query,
object widgetParams,
} = renderOptions;
if (isFirstRender) {
// Do some initial rendering and bind events
}
// Render the widget
}
Rendering options #
hitsPerPage
# |
type: number
The maximum number of hits returned per page. |
||
Copy
|
|||
nbHits
# |
type: number
The number of hits matched by the query. |
||
Copy
|
|||
areHitsSorted
# |
type: boolean
Indicates whether Relevant sort is applied to the result. |
||
Copy
|
|||
nbSortedHits
# |
type: number
The number of sorted hits from Relevant sort. |
||
Copy
|
|||
nbPages
# |
type: number
The number of returned pages. Calculation is based on the total number of hits ( |
||
Copy
|
|||
page
# |
type: number
The position of the current page (zero-based). |
||
Copy
|
|||
processingTimeMS
# |
type: number
The time the server took to process the request, in milliseconds. This doesn’t include network time. |
||
Copy
|
|||
query
# |
type: string
The query sent to the server. |
||
Copy
|
|||
widgetParams
# |
type: object
All original widget options forwarded to the render function. |
||
Copy
|
Create and instantiate the custom widget#
We first create custom widgets from our rendering function, then we instantiate them. When doing that, there are two types of parameters you can give:
- Instance parameters: they are predefined parameters that you can use to configure the behavior of Algolia.
- Your own parameters: to make the custom widget generic.
Both instance and custom parameters are available in connector.widgetParams
, inside the renderFunction
.
const customStats = instantsearch.connectors.connectStats(
renderStats
);
search.addWidgets([customStats()]);
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
40
41
42
43
44
45
46
47
48
49
50
51
// Create the render function
const renderStats = (renderOptions, isFirstRender) => {
const {
nbHits,
areHitsSorted,
nbSortedHits,
processingTimeMS,
query,
widgetParams,
} = renderOptions;
if (isFirstRender) {
return;
}
let count = '';
if (areHitsSorted) {
if (nbSortedHits > 1) {
count = `${nbSortedHits} relevant results`;
} else if (nbSortedHits === 1) {
count = '1 relevant result';
} else {
count = 'No relevant result';
}
count += ` sorted out of ${nbHits}`;
} else {
if (nbHits > 1) {
count += `${nbHits} results`;
} else if (nbHits === 1) {
count += '1 result';
} else {
count += 'no result';
}
}
widgetParams.container.innerHTML = `
${count} found in ${processingTimeMS}ms
${query ? `for <q>${query}</q>` : ''}
`;
};
// Create the custom widget
const customStats = instantsearch.connectors.connectStats(renderStats);
// Instantiate the custom widget
search.addWidgets([
customStats({
container: document.querySelector('#stats'),
})
]);