next-instantsearch
Server side rendering with Next.js and React InstantSearch
Installation
npm install next-instantsearch
yarn add next-instantsearch
Getting started
Use the withInstantSearch
HOC to configure InstantSearch and enable SSR:
import algoliasearch from "algoliasearch/lite";
import { withInstantSearch } from "next-instantsearch";
import {
Configure,
Highlight,
Hits,
Pagination,
RefinementList,
SearchBox,
} from "react-instantsearch-dom";
const searchClient = algoliasearch("your_app_id", "your_api_key");
const HitComponent = ({ hit }) => <Highlight attribute="name" hit={hit} />;
const Page = () => (
<>
<Configure hitsPerPage={12} />
<SearchBox />
<RefinementList attribute="categories" />
<Hits hitComponent={HitComponent} />
<Pagination />
</>
);
export default withInstantSearch({
indexName: "your_index",
searchClient,
})(Page);
You may also configure via getInitialProps
:
import algoliasearch from "algoliasearch/lite";
import { withInstantSearch } from "next-instantsearch";
import {
Configure,
Highlight,
Hits,
Pagination,
RefinementList,
SearchBox,
} from "react-instantsearch-dom";
const searchClient = algoliasearch("your_app_id", "your_api_key");
const HitComponent = ({ hit }) => <Highlight attribute="name" hit={hit} />;
const Page = () => (
<>
<Configure hitsPerPage={12} />
<SearchBox />
<RefinementList attribute="categories" />
<Hits hitComponent={HitComponent} />
<Pagination />
</>
);
Page.getInitialProps = async () => ({
indexName: "your_index",
searchState: {
refinementList: {
categories: ["Appliances"],
},
},
});
export default withInstantSearch({
searchClient,
})(Page);
Advanced Usage
Out of the box next-instantsearch
will trigger a shallow route replace when your search state changes.
This may not work for you if you're using a non standard router or maybe you want to prevent this route change with a no-op.
import { withInstantSearch, createURL, onSearchStateChange } from "next-instantsearch";
import { Router } from "../i18n";
withInstantSearch({
indexName: "your_index",
searchClient,
onSearchStateChange: (searchState) => onSearchStateChange(searchState, Router),
onSearchStateChange: () => {},
onSearchStateChange: (searchState, Router) => {
},
})(Page);
You may need to decorate your component with some wrapper components due to the way react-instantsearch-dom
handles server side rendering.
withInstantSearch({
indexName: "your_index",
searchClient,
decorate: ({ ctx, component }) => (
<Provider store={ctx.store}>{component()}</Provider>
),
})(Page);