javascript - Nuxt Algolia InstantSearch:实现客户端动态获取时的服务端渲染
问题描述
TL;DR:有没有办法访问在 Vue 中创建的setup()
变量mixins
?
我是 Vue (/ Nuxt) 和使用 vue-instantsearch 的 Algolia 的新手。我想将 Algolia 添加到我的 Nuxt 3 应用程序中。
到目前为止,它可以工作,但是仅当页面在客户端呈现时。当它的服务器端渲染时它不起作用。幸运的是,Nuxt 中有服务器端渲染vue-instantsearch 的指南。
在文档中,它searchClient
在组件之前启动,然后在 mixin 中使用该客户端,如下所示:
// ...
const searchClient = algoliasearch(
'latency',
'6be0576ff61c053d5f9a3225e2a90f76'
);
export default {
mixins: [
createServerRootMixin({
searchClient,
indexName: 'instant_search',
}),
],
// ...
但是,就我而言,我想将搜索限制为用户。(不是每个用户都应该看到每个条目。)因此,我为我的用户动态生成令牌并searchClient
在我的setup()
.
setup() {
const sessionSearchTokenQuery = useQuery(gqlSessionSearchToken)
const sessionSearchToken = useResult(sessionSearchTokenQuery.result)
const searchClient = ref<SearchClient | null>(null)
watch(
sessionSearchToken,
(token) => {
if (token?.appID && token?.clientKey) {
searchClient.value = algoliasearch(token.appID, token.clientKey)
}
},
{ immediate: true }
)
return { searchClient, token: sessionSearchToken }
},
所以现在我认为我无法访问searchClient
mixins 中的 ,可以吗?
我该如何解决这个问题?有没有办法先获取客户端,然后启动 mixins 并将客户端传递给 mixins?是否有一个两组件解决方案,其中一个组件创建searchClient
,将其传递给下一个组件,然后在 mixin 中使用它?
编辑:我正在使用一个 hacky 解决方案。
export default defineComponent({
components: {
SessionCardLoad,
},
provide() {
return {
$_ais_ssrInstantSearchInstance: this.instantsearch,
}
},
setup() {
const sessionSearchTokenQuery = useQuery(gqlSessionSearchToken)
const sessionSearchToken = useResult(sessionSearchTokenQuery.result)
const searchClient = ref<SearchClient | null>(null)
watch(
sessionSearchToken,
(token) => {
if (token?.appID && token?.clientKey) {
searchClient.value = algoliasearch(token.appID, token.clientKey)
}
},
{ immediate: true }
)
const { data } = createServerRootMixin({searchClient, $config.MIML_STAGE + '-miml-sentences'})
const { instantSearch } = data()
return { searchClient, token: sessionSearchToken, instantsearch }
},
head() {
return {
link: [
{
rel: 'stylesheet',
href: 'https://cdn.jsdelivr.net/npm/instantsearch.css@7.4.5/themes/satellite-min.css',
},
],
}
},
})
在这里,我使用 setup 中的 mixin 来获取 mixin 通常会返回的数据。我模仿了provide
mixin 代码中的步骤。
我在这里的主要问题是访问$config
该setup()
属性。
解决方案
推荐阅读
- javascript - "';' 在第一个“=>”(vsc)上是必需的
- python - 无法使用 selenium 获取 Javascript 生成页面的 HTML 源代码
- c# - 如何为 dotnet 应用程序创建服务
- apache - 即使具有正确的权限,某些文件也会导致“403 禁止”
- azure-active-directory - Azure 服务主体密钥到期时间(以小时为单位)
- excel-formula - 错误:运算符“<”的参数类型不正确。预期的布尔值,收到的文本
- wordpress - 无法将 google 日历 api 与我的网站链接
- java - 如果状态为 200 的错误未捕获 Sprint 启动自定义异常并且响应始终为空
- visual-studio-code - 如何在 VSCode 中更改指定语法的颜色,而不影响主题着色的其余语法?
- javascript - 从数据数据数组中提取 url 标签