Задать вопрос
  • Поиск useFuse или Fuse.js как с ним работать?

    @iljaGolubev
    У вас бардак в алгоритме поэтому с `new Fuse` (скорее всего и с useFuse) работает, но не так как вы ожидали.
    Пустой массив это логичный вывод console.log('results:', results) в этот момент
    потому что getProducts() вы вызываетe после изменений в input

    Рабочий кусок с useFuse
    import { useFuse } from '@vueuse/integrations/useFuse';
    const data = ref([]);
    const input = ref('')
    const found = ref();
    fetch('https://fakestoreapi.com/products').then(r => r.json()).then(j => {data.value = j}) 
    const { results } = useFuse(input, data, { matchAllWhenSearchEmpty:false, fuseOptions: { includeScore: true, keys: ['title'] } })
    /*<template>
        {{ results }}
    </template>*/
    Ответ написан
    1 комментарий
  • Результаты поиска или как настроить выпадающий список?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Добавляем в компонент свойство - индекс выделенного элемента выпадающего списка:

    const searchIndex = ref(-1);

    По нажатию на стрелки делаем ему плюс-минус один:

    function onKeydown({ key }) {
      if (key === 'Escape') {
        searchQuery.value = '';
        return;
      }
    
      const data = filteredProducts.value ?? [];
      const { length } = data;
    
      if (length) {
        const index = searchIndex.value;
        const step = +(key === 'ArrowDown') || -(key === 'ArrowUp');
    
        if (step) {
          searchIndex.value = (Math.max(-1, index + step) + length) % length;
        } else if (key === 'Enter' && index !== -1) {
          onSelectProduct(data[index]);
        }
      }
    }
    
    watch(() => !!searchQuery.value.length, value => value
      ? document.addEventListener('keydown', onKeydown)
      : document.removeEventListener('keydown', onKeydown)
    );

    В зависимости от равенства значения этого свойства текущему индексу в v-for, назначаем элементу списка класс, который его визуально выделит:

    .active {
      background: #ccc;
    }

    <li
      v-for="(n, i) in filteredProducts"
      :key="n.id"
      :class="{ active: i === searchIndex }"
      @mouseenter="searchIndex = i"
      @click="onSelectProduct(n)"
    >

    Если при изменении данных, на основе которых строится список, надо сбросить выделение, создаём соответствующий наблюдатель:

    watch(filteredProducts, () => searchIndex.value = -1);

    Вот как-то так.
    Ответ написан
    1 комментарий
  • Поиск на сайте. Как сделать "ничего не найдено"?

    0xD34F
    @0xD34F Куратор тега Vue.js
    const filteredProducts = computed(() => {
      const search = searchQuery.value.toLowerCase();
      return search.length > 2
        ? data.value.filter(n => n.title.toLowerCase().includes(search))
        : null;
    });

    <ul v-if="filteredProducts" class="search-result">
      <li v-if="!filteredProducts.length">
        <h3>ничего не найдено</h3>
      </li>
      <li v-for="n in filteredProducts">
        <div>
          <Image :src="n.image" :alt="n.title" width="40" height="40" />
        </div>
        <h3>{{ n.title }}</h3>
        <div>
          <p>{{ n.price }}</p>
        </div>
      </li>
    </ul>
    Ответ написан
    1 комментарий
  • Жестко задан логотип в шаблоне 150 на 30, как убрать это ограничение?

    Natalia_ai
    @Natalia_ai
    люблю вёрстку
    Попробуйте добавить, например, width: 200px; в img css документа, как на скрине 5dca673885434950335276.jpeg

    Убирать 150 на 30 необязательно.
    Ответ написан