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

Vue3全局配置Typesense连接并跨组件访问searchClient

在Vue3中全局共享Typesense的searchClient

步骤1:在main.js中整合Typesense配置并全局提供searchClient

把Typesense适配器的初始化代码加入main.js,并通过Vue的provide方法将生成的searchClient全局共享:

import { createApp } from 'vue'
import App from './App.vue'
import router from './router';
import OneSignal from 'onesignal-cordova-plugin';
import { createPinia } from 'pinia'
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'
import VueApexCharts from "vue3-apexcharts";
import InstantSearch from 'vue-instantsearch/vue3/es';
import { IonicVue } from '@ionic/vue';
// 导入Typesense适配器
import TypesenseInstantSearchAdapter from "typesense-instantsearch-adapter";

/* 样式导入部分保持不变 */
import '@ionic/vue/css/core.css';
import '@ionic/vue/css/normalize.css';
import '@ionic/vue/css/structure.css';
import '@ionic/vue/css/typography.css';
import '@ionic/vue/css/padding.css';
import '@ionic/vue/css/float-elements.css';
import '@ionic/vue/css/text-alignment.css';
import '@ionic/vue/css/text-transformation.css';
import '@ionic/vue/css/flex-utils.css';
import '@ionic/vue/css/display.css';
import './theme/variables.css';

// 初始化Typesense适配器
const typesenseInstantsearchAdapter = new TypesenseInstantSearchAdapter({
  server: {
    apiKey: "你的实际API密钥", // 替换为真实密钥
    nodes: [
      {
        host: "example.com", // 替换为你的Typesense服务器地址
        path: "",
        port: "8108",
        protocol: "https",
      },
    ],
    cacheSearchResultsForSeconds: 2 * 60,
  },
  additionalSearchParameters: {
    query_by: "title,region,location,search_data"
  },
});
const searchClient = typesenseInstantsearchAdapter.searchClient;

const pinia = createPinia()
pinia.use(piniaPluginPersistedstate)

const app = createApp(App)
  .use(IonicVue)
  .use(router)
  .use(VueApexCharts)
  .use(InstantSearch)
  .use(pinia);

// 全局提供searchClient,供所有组件注入使用
app.provide('searchClient', searchClient);

router.isReady().then(() => {
  app.mount('#app');
});

步骤2:在根组件中设置全局InstantSearch容器

修改App.vue,添加根级别的<ais-instant-search>组件,注入全局的searchClient,所有子组件的InstantSearch组件将自动继承此配置:

<template>
  <ion-app>
    <ais-instant-search 
      :search-client="searchClient" 
      index-name="latest_catalog"
      style="width:100%;padding:5px;padding-right:10px;"
    >
      <ion-router-outlet />
    </ais-instant-search>
  </ion-app>
</template>

<script setup>
import { inject } from 'vue';

// 注入全局提供的searchClient
const searchClient = inject('searchClient');
</script>

步骤3:在子组件中直接使用InstantSearch组件

现在任意子页面或组件都可以直接使用<ais-configure>、<ais-search-box>等组件,无需重复传入search-client:

<template>
  <div>
    <ais-configure
      :hits-per-page.camel="hpp_number"
      :filters="car_model"
      :query="search_query"
    />
    <ais-search-box placeholder="搜索内容..." />
    <ais-hits>
      <template #item="{ item }">
        <div class="hit-item">
          <h3>{{ item.title }}</h3>
          <p>{{ item.location }}</p>
        </div>
      </template>
    </ais-hits>
  </div>
</template>

<script setup>
// 定义组件所需的变量
const hpp_number = 10;
const car_model = "你的过滤规则";
const search_query = "";
</script>

替代方案:全局挂载到app.config.globalProperties

如果偏好传统全局属性的方式,可在main.js中添加:

app.config.globalProperties.$searchClient = searchClient;

之后在组件中通过以下方式获取:

import { getCurrentInstance } from 'vue';
const app = getCurrentInstance();
const searchClient = app.appContext.config.globalProperties.$searchClient;

但更推荐使用provide/inject的方式,符合Vue3组合式API的设计规范。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 15:14:57