Algolia - наблюдатель атрибутов мгновенного поиска Vue
В моем приложении есть следующий компонент:
<ais-menu attribute="productType"></ais-menu>
Я хотел бы следить за изменениями этого атрибута и вносить глобальные изменения на мою страницу, когда она изменяется.
Например:
watch:{
"state.productType": {
deep: true,
handler(state){
console.log("If this text logs, my question is answered!");
}
}
}
Есть ли способ добавить наблюдателя к свойству поиска или есть способ инициировать событие при изменении атрибута?
Документы ais-menu показывают свойства, которые вы можете установить для компонента, но, похоже, нет никаких событий, которые вы могли бы прослушивать, или примера установки наблюдателя.
Точно так же я задавался вопросом, есть ли что-то доступное на общем <ais-instant-search>
компонент, но я ничего не нашел в документации.
Этот вопрос относится к'searchStore._results'
атрибут, но более поздний комментатор говорит, что он больше не работает.
watch: {
'searchStore._results'(val) {
// Emit event
}
}
Полный код ниже:
<template>
<div>
<ais-instant-search :search-client="searchClient" index-name="galeta_products" :routing="routing">
<div class="centered-banner text-center">
<h1 class="h2">{{ taxName }}</h1>
<p>{{ taxDescription }}</p>
</div>
<ais-menu attribute="productType">
<ul
slot-scope="{
items,
canToggleShowMore,
isShowingMore,
toggleShowMore,
refine,
createURL,
}"
>
<li v-for="item in items" :key="item.value" :class="{ 'active' : item.isRefined }">
<a
:href="createURL(item.value)"
@click.prevent="refine(item.value)"
>
{{ item.label }}
</a>
</li>
</ul>
</ais-menu>
</ais-instant-search>
</div>
</template>
<script>
import algoliasearch from 'algoliasearch/lite';
import routing from './SearchRouting.js';
export default {
props: ['taxName', 'taxDescription'],
data() {
return {
liveTaxName: this.taxName,
liveTaxDescription: this.taxDescription,
searchClient: algoliasearch(
'XXXXXXXX',
'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
),
routing
};
},
watch:{
// Here is what I want to do
"state.productType": {
deep: true,
handler(state){
this.liveTaxName = TAXONOMIES.find(tax => tax.slug == state.category).name;
this.liveTaxDescription = TAXONOMIES.find(tax => tax.slug == state.category).description;
}
}
}
};
</script>
1 ответ
Одно из возможных решений - перенести вызов в refine
функция. Затем вы можете запустить любой пользовательский код.
<template>
<!-- ... -->
<ais-menu attribute="categories">
<ul slot-scope="{ items, refine }">
<li v-for="item in items" :key="item.value">
<a href="#" @click.prevent="onMenuClick(item.value, refine)">
{{ item.label }}
</a>
</li>
</ul>
</ais-menu>
</template>
<script>
export default {
// ...
methods: {
onMenuClick(value, refine) {
console.log(value);
refine(value);
}
}
};
</script>
Вы можете найти пример на CodeSandbox.