Ответы пользователя по тегу Vue.js
  • Какими способами можно получить первое попавшееся изображение?

    Vertenz
    @Vertenz
    Мечтетель
    Самый простой способ это добавить поле на бэке в основное тело сущности при учете определенных фильтров, например цвета. И надо декомпозировать, чтобы не тащить все вплоть до изображения. Не очень понятно что значит перво попавшуюся, вряд ли же подойдут и из других товаров и ведь нужно отталкиваться от правильно выбранного цвета?

    Но если ответ всегда такой, то можно так, возьмем для пример один из присланных вами товаров и распарсим.
    const jsonString = `{"items":[{"id":2,"title":"Футболка","slug":"futbolka","price":1000,"colors":[{"id":77,"color":{"id":27,"title":"white","code":"#ffffff"},"gallery":[{"file":{"url":"ссылка на изображение","name":"36efa79c31cb4400f8f9ce69a7d6f6a6.png","originalName":"Rectangle 13++.png","extension":"png","size":"63.5 Кб"}}]}],"seasons":[{"id":3,"title":"Лето","code":"summer","productsCount":10}],"materials":[{"id":1,"title":"Хлопок","code":"cotton","productsCount":6},{"id":2,"title":"Шерсть","code":"wool","productsCount":4}]}]}`;
    
    const data = JSON.parse(jsonString);
    
    // дальше перебором ищем где есть изображение
    if (data?.items[0]?.colors.length) {
    for (let i = 0; i <= data.items[0].colors.length; i++) {
       // проваливаемся в еще один цикл уже на элементы в gallery, и там ищем url, и если есть то заканчиваем цикл через r
       for (let j = 0; j <= data.items[0].colors[i].length; j++) {
         //и еще цикл на галерии
       for (let n = 0; n <= data.items[0].colors[i].gallery.length; j++) {
         if (data?.items[0]?.colors[i]?.gallery[n]?.url) {
         return data.items[0].colors[i].gallery[n].url;
       }
    }
    
       }
    }
    }
    
    // не забудьте дописать выход из всех циклов

    но это выглядит очень странно, можно еще чрез forEach, но его не оставить, тч если будет миллион товаров то все упадет

    items.forEach(item => {
      const keys = Object.keys(item);
      let imageKey = '';
    
      keys.some(key => {
        if (typeof item[key] === 'object' && item[key] !== null) {
          const subkeys = Object.keys(item[key]);
          const file = subkeys.find(subkey => {
            if (typeof item[key][subkey] === 'object' && item[key][subkey] !== null) {
              return item[key][subkey].hasOwnProperty('url');
            }
            return false;
          });
          if (file) {
            imageKey = key;
            return true;
          }
        }
        return false;
      });
    
      return `${item.title}"  "${imageKey}`; 
    // можно дальше делать что угодно с ключем или сразу брать изображение 
    });


    Но честно говоря я бы еще раз подумал над ТЗ :) И точно бы вел довел бы до дочернего элемента только содержимое gallery и тогда можно обойтись без этих безумств. И проверить уже только элементы внутри gallery
    Ответ написан
  • Как вставить готовый iframe в шаблон Vue3/Nuxt3?

    Vertenz
    @Vertenz
    Мечтетель
    есть несколько вариантов, во-первых, вам надо вставить ссылку в фрем, и так можно избежать v-html
    <iframe :src="iftame.src"></iframe>

    Либо попробовать через otherHTMl

    const iframe = myapi.getIframe()
        const iframe = response.data.outerHTML
        return { iframeHtml }
    Ответ написан
    Комментировать
  • Как динамически импортировать EditorJS в Vue 3?

    Vertenz
    @Vertenz
    Мечтетель
    можно попробовать через определение того что процесс на клиенте
    if (process.client) {
      import('editorjs').then(EditorJS => {
        // Здесь можно использовать EditorJS
        const editor = new EditorJS(/* настройки */);
      });
    }
    Ответ написан
    Комментировать
  • После перехода на vite появилась ошибк Cannot access 'Layout' before initialization?

    Vertenz
    @Vertenz
    Мечтетель
    если у вас хранятся правльно лейауты, то нужно просто передавать имя.
    layout: 'default',
    Ответ написан
    Комментировать
  • Как сделать custom input на vue3?

    Vertenz
    @Vertenz
    Мечтетель
    Крестик оберуть в transition, задать стили. Повесть v-if на блок с крестиком, который проверяет есть ли что-то в инпуте.
    Дальше повесить @click на крестик. И при клике изменять данные на пустоту.
    Без кода не очень понятна вложенность у вас, но есть что просто передавайте события через emit
    Ответ написан
    Комментировать
  • Как правильно общаться с базой данных во Vue?

    Vertenz
    @Vertenz
    Мечтетель
    Если правильно понял задачу) То у вас идет авторизация, дальше получили данные о пользователе. Чтобы не тащить их во все нужные компоненты то их можно сохранить в стор. Дальше просто при перезагрузке приложения или в необходимых для вас случаях вы можете проверять время изменения данных на бэке и у вас (или какой-то id изменения), чтобы понять нужен ли новый запрос.
    Ответ написан
  • Как передать blob объект на сервер?

    Vertenz
    @Vertenz
    Мечтетель
    Если правильно понял, то есть на фронте форма с инпутом файла, и его надо отправить на бэк?
    И если да, то сперва надо получить файл
    this.file = event.target.files[0]; //можно через реф при нажатии на кнопку отправить если не нужны проверки

    Потом нужно создать форму, добавить туда поле с правильным именем (проверьте доку или уточни у бэка), и дальше пост по нужному пути
    conts formData = new FormData();
          formData.append('правильное_имя_ключа', this.file);
    
          axios.post('правильный_путь', formData, {
            headers: {
              'Content-Type': 'multipart/form-data'
            }
          }).then(response => {
            // что-то отобразить при успешной отправке
          }).catch(error => {
            // что-то отобразить при ошибке
          });
    Ответ написан
    1 комментарий
  • Ошибка eslint,ошибка есть-но ошибку по какой-то причине не выводит?

    Vertenz
    @Vertenz
    Мечтетель
    а это вся ошибка которую отдает линт? и настроен ли в редакторе кода линт, так можно посмотреть хотя бы строчку на которую ругается? Может ругаться на |. Проверь так
    <template>
      <div class="navbar">
        <nav>
          <router-link to="/">Home</router-link> | <router-link to="/about">About</router-link> | <router-link to="/test">Test</router-link>
        </nav>
      </div>
    </template>
    Ответ написан
    Комментировать
  • Почему nuxt работает медленно из за nuxt-i18n?

    Vertenz
    @Vertenz
    Мечтетель
    возможно поможет prop " no-prefetch "
    <NuxtLink to="/about" no-prefetch>About page not prefetched</NuxtLink>

    Так же возможно загрузить языки в базу данных, и загружать нужный по нажатию, а в самом приложении весть текст вставлять уже от туда
    Ответ написан
    Комментировать