UI libraries / Vue InstantSearch / Widgets
Signature
<ais-hits-per-page
  :items="object[]"
  // Optional parameters
  :transform-items="function"
  :class-names="object"
/>
Import
1
2
3
4
5
6
7
8
9
import { AisHitsPerPage } from 'vue-instantsearch';
// Use 'vue-instantsearch/vue3/es' for Vue 3

export default {
  components: {
    AisHitsPerPage
  },
  // ...
};

1. Follow additional steps in Optimize build size to ensure your code is correctly bundled.
2. This imports all the widgets, even the ones you don’t use. Read the Getting started guide for more information.

About this widget

The ais-hits-per-page widget displays a select element to let users change the number of displayed hits.

If you only want to configure the number of hits per page without displaying a widget, you can use the ais-configure widget with the hitsPerPage search parameter.

Examples

1
2
3
4
5
6
<ais-hits-per-page
  :items="[
    { label: '8 hits per page', value: 8, default: true },
    { label: '16 hits per page', value: 16 },
  ]"
/>

Props

Parameter Description
items
type: object[]
Required

The list of available options, with each item:

  • label: string: the label to display in the option.
  • value: number: the number of hits to display per page.
  • default: boolean: whether it’s the default hits per page on first search.
1
2
3
4
5
6
<ais-hits-per-page
  :items="[
    { label: '8 hits per page', value: 8, default: true },
    { label: '16 hits per page', value: 16 },
  ]"
/>
transform-items
type: function
default: items => items
Optional

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.

In addition, the full results data is available, which includes all regular response parameters, as well as parameters from the helper (for example disjunctiveFacetsRefinements).

When using an array, take steps to avoid creating infinite loops. When you use an array as a prop, it causes the widget to re-register on every render, and this can sometimes cause these infinite loops.

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
<template>
  <!-- ... -->
  <ais-hits-per-page
    [...]
    :transform-items="transformItems"
  />
</template>

<script>
  export default {
    methods: {
      transformItems(items) {
        return items.map(item => ({
          ...item,
          label: item.label.toUpperCase(),
        }));
      },

      /* or, combined with results */
      transformItems(items, { results }) {
        return items.map(item => ({
          ...item,
          label: item.isRefined && results
            ? `${item.label} (${results.nbPages} pages in total)`
            : item.label,
        }));
      },
    },
  };
</script>
class-names
type: object
default: {}
Optional

The CSS classes you can override:

  • ais-HitsPerPage: the root of the widget.
  • ais-HitsPerPage-select: the select element.
  • ais-HitsPerPage-option: the option element of the select.
1
2
3
4
5
6
7
8
<ais-hits-per-page
  [...]
  :class-names="{
    'ais-HitsPerPage': 'MyCustomHitsPerPage',
    'ais-HitsPerPage-select': 'MyCustomHitsPerPageSelect',
    // ...
  }"
/>

Customize the UI

Parameter Description
default

The slot to override the complete DOM output of the widget.

Note that when you implement this slot, none of the other slots will change the output, as the default slot surrounds them.

Scope

  • items: object[]: the list of items the widget can display.
  • canRefine: boolean: whether a refinement can be applied.
  • refine: (value: number) => void: the function to call with the next value of hits per page.

Where each item is an object containing:

  • label: string: the label to display in the option.
  • value: number: the number of hits to display per page.
  • isRefined: boolean: indicates if the item is the current refined value.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<ais-hits-per-page
  :items="[
    { label: '8 hits per page', value: 8, default: true },
    { label: '16 hits per page', value: 16 },
  ]"
>
  <template v-slot="{ items, refine }">
    <ul>
      <li v-for="item in items" :key="item.value">
        <button
          :style="{ fontWeight: item.isRefined ? 'bold' : '' }"
          @click="refine(item.value)"
        >
          {{ item.label }}
        </button>
      </li>
    </ul>
  </template>
</ais-hits-per-page>

HTML output

1
2
3
4
5
6
<div class="ais-HitsPerPage">
  <select class="ais-HitsPerPage-select">
    <option class="ais-HitsPerPage-option" value="8">8 per page</option>
    <option class="ais-HitsPerPage-option" value="16">16 per page</option>
  </select>
</div>
Did you find this page helpful?