You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React项目中Algolia SearchBox的queryHook属性报错:search不是函数

解决Algolia SearchBox queryHook报错:search is not a function

首先,你的错误根源是对queryHook的参数结构理解有误——它接收的是单个对象参数,而非两个独立的query和search参数。你现在的写法把第二个参数当成了search,但实际上这个位置的变量是undefined,自然会抛出“search is not a function”的错误。

修正后的queryHook写法

正确的queryHook应该通过解构对象来获取search方法:

const queryHook = ({ query, search }) => {
  search(query);
};

function Search() {
  return <SearchBox queryHook={queryHook} />;
}

实现搜索建议功能的完整思路

如果要在搜索栏下方展示可点击的搜索建议,仅靠queryHook不够,还需要结合Algolia的相关组件实现:

方式1:使用Autocomplete组件(推荐)

它内置了建议列表渲染、点击选中填入搜索框的逻辑,无需手动处理太多细节:

import { Autocomplete } from '@algolia/autocomplete-react';
import { useInstantSearch } from 'react-instantsearch-hooks-web';

function Search() {
  const { index } = useInstantSearch();

  return (
    <Autocomplete
      getSources={() => [
        {
          sourceId: 'images',
          getItems({ query }) {
            return index.search(query, { hitsPerPage: 5 });
          },
          templates: {
            item({ item }) {
              return <div onClick={() => document.querySelector('input[aria-label="Search"]').value = item.title}>{item.title}</div>;
            },
          },
        },
      ]}
      renderInput={({ getInputProps }) => (
        <input {...getInputProps({ placeholder: '搜索图片...' })} />
      )}
    />
  );
}

方式2:结合SearchBox与Hits组件(基础版)

如果想基于现有的SearchBox,可以用Hits组件展示建议结果,再通过状态控制搜索框内容:

import { SearchBox, Hits } from 'react-instantsearch-hooks-web';
import { useState } from 'react';

function Search() {
  const [searchQuery, setSearchQuery] = useState('');

  return (
    <div>
      <SearchBox 
        query={searchQuery}
        onQueryChange={setSearchQuery}
      />
      <Hits
        hitsPerPage={5}
        hitComponent={({ hit }) => (
          <div onClick={() => setSearchQuery(hit.title)} style={{ cursor: 'pointer', padding: '8px' }}>
            {hit.title}
          </div>
        )}
      />
    </div>
  );
}

关键注意点

  • queryHook的核心作用是拦截搜索请求时机(比如防抖、修改搜索词后再触发搜索),不是直接用来实现建议列表的。
  • 确保你的React InstantSearch版本与使用的API匹配,不同版本的参数可能有差异。

内容的提问来源于stack exchange,提问作者Coolkid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 02:12:13