Ответы пользователя по тегу Nuxt.js
  • Почему .value в nuxt3 выдает не тот результат в консоли?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Во первых: всё зависит от сигнатуры этого вашего useApiFetch, очень многое в vue 3 можно сломать неудачной деструктуризацией. Но допустим сам хук нормальный.
    В таком случае isPending - это ref, а значит он и должен быть прокси, чтоб собственно работала энтая самая реактивность. Чтоб отобразить в консоли чистый объект - есть хэлпер toRaw(только после этого он уже не будет динамическим).

    Далее: если вы выводите в консоль isPending.value - то в консоль, очевидно, попадает значение на момент вызова console.log. Магическим образом прямо в консоли оно уже не изменится.

    Если ты хочешь понаблюдать за изменениями isPending - можешь сделать так:
    watch(isPending, (value) => console.log('watch isPending', value), { immediate: true });


    В заключение предположу, что всё у вас работает как должно, а проблемы с пониманием реактивности vue и асинхронности как таковой.
    Ответ написан
    Комментировать
  • Smooth scroll to anchor links in Nuxt3 как сделать?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Точно также как и не в nuxt.
    function manualSmoothScroll(event) {
      // находим хэш ссылу по которой мы кликнули
      const id = event.target.closest('a[href^="#"]')?.hash;
      // если клик куда-то ещё - ничего не делаем
      if (!id) return;
      
      
      // находим цель куда будем скроллить по хэшу
      const target = document.querySelector(id);
      // если не нашли - ничего не делаем
      if (!target) return;
      
      // отменяем стандартный переход
      event.preventDefault();
      // едем руками
      target.scrollIntoView({ behavior: "smooth" });
    }
    
    // при загрузке
    addEventListener('click', manualSmoothScroll, true);
    
    
    // при выгрузке
    removeEventListener('click', manualSmoothScroll, true);
    
    // если действовать надо только в рамках элнметата
    // elementRef.value.addEvent... elementRef.value.removeve... 
    // или this.$refs.element... 
    // или this.$el...
    Ответ написан
    1 комментарий
  • Как во Vue Router указать не обязательную часть url?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    На обычном Vue роутере такие маршруты делаются примерно так:
    {
    		path: '/catalog/mebel', 
    		children: [
    			{
    				path: 'page-:page(\\d+)?', 
    				alias: '',
    				component: Mebel,
    			},
    			{
    				path: ':category', 
    				children: [
    					{
    						path: 'page-:page(\\d+)?', 
    						alias: '',
    						component: MebelCategory
    					},
    					{
    						path: ':article', 
    						component: MebelArticle
    					}
    				]
    			},
    		], 
    	}



    В nuxt это можно добавить\изменить тут.
    Ответ написан
    Комментировать
  • TypeScript: как убрать null из свойства объекта?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    if (error.value?.statusCode !== 404) не гарантирует, что в user не будет null, мало ли там ошибка 50х или даже нет ошибки, а просто сервер глюканул.

    Так что у тебя два варианта:
    1. То что от тебя хочет typescript, явная проверка:
    if (!user) {
      throw new Error('empty responce')
    }

    2. Исправление типа, если ты очень доверяешь своему серверу:
    а) Вариант предложенный Lynn «Кофеман» с явным кастом;
    б) Обёртка над useFetch которая внутри себя скастует тип по новому или изменение самого типа useFetch.
    Ответ написан
    Комментировать
  • Можно ли в Nuxt не рендерить сайт на каждом хите?

    Aetae
    @Aetae
    Тлен
    На всякий, чтоб убедиться что мы на одной волне: обычный SSR работает ровно один раз - когда пользователь только зашёл на сайт. Дальше пользователь перемещается внутри SPA. Каждый раз перезапрашивают SSR страницы только боты.
    По этому обычно тут ничего не оптимизируют.

    Однако если хочется - вместо того, чтоб что-то городить, следует воспользоваться классическим кэшированием: выделить nginx который будет кэшировать ответы, а не мучать сервер, и не париться.
    Ответ написан
    1 комментарий
  • Как заставить Nuxt Image работать с изображениями из папки assets?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    С одной стороны для кастомных компонентов тебе потребовался бы transformAssetUrls. Однако открыв доки я вижу там:
    Converts src to provider optimized URLs

    В связи с чем вопрос: а путь то такой вообще работает?
    Что будет в img если ты делаешьimport img from '~/assets/images/header.jpg'?
    Ответ написан
    3 комментария
  • Как использовать директивы внутри кастомных директив в nuxt 3?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Встроенного механизма наследования нет. Директивы - это уже продвинутый механизм, подразумевается, что раз уж вы взялись за директивы - вы глубоко понимаете механизмы Vue. Если вам сильно хочется таки использовать чужую директиву внутри своей, надо будет самостоятельно экспериментировать, навскидку вижу два варианта:
    1. "тупой", но точно работающий - пробрасывать все возможные хуки директивы напрямую:
    const myDirective = {
      created(el, binding, vnode, prevVnode) {
         otherDirective?.created(el, binding, vnode, prevVnode);
         ...
      },
      beforeMount(el, binding, vnode, prevVnode) {
         otherDirective?.beforeMount(el, binding, vnode, prevVnode);
         ...
      },
      ....
    }

    2. "умный", но требующий знаний и экспериментов - манипуляции напрямую с vNode.

    Однако, возможно, лучше будет сделать просто-компонент-обёртку, который просто навесит все нужные директивы на обёрнутый компонент, примерно так:
    import { useSlots, withDirectives, resolveDirective } from 'vue'
    
    export default {
      setup() {
        const htmlDirective = {
          mounted(el, html) {
            el.innerHTML = html.value
          }
        }
    
        const colorDirective = {
          mounted(el, color) {
            el.style.color = color.value
          }
        }
        
        // const someDirective = resolveDirective('some-directive');
    
        const slots = useSlots();
    
        return () => withDirectives(slots.default()[0], [
          [htmlDirective, 'some html'],
          [colorDirective, 'red'],
        ])
      }
    }

    <wrapper><some-compnent /></wrapper>
    Ответ написан
    1 комментарий
  • Верный ли алгоритм для фильтра товаров?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Нормально. Источником состояния должно быть только одно место: в данном случае этим источником выступает url.
    Ответ написан
    Комментировать
  • Как проверить наличие nuxt во vue3?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Можно с помощью getCurrentInstance, но не нужно(прочтите предупреждение по ссылке).
    Лучше расскажите зачем оно вам надо, а мы предложим лучшее решение. :)
    Ответ написан
    Комментировать
  • Почему не работает поиск по массиву из объектов?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Во-первых: вопрос не относится к vue, он о чистом js.
    Во-вторых: код рабочий, просто у вас, судя по всему, отсутствуют такие item, где одновременно были бы равны item.product.article, item.size и item.warehouse.id, т.к. только в таком случае ветка уйдёт в нужную вам сторону. Если логика предполагалась какой-то другой - уточняйте.
    Во-третьих: используйте, по возможности, для отдельно стоящих объектов reactive вместо ref, код чище и приятней будет.
    Ответ написан
    Комментировать
  • Как работает State Managment в nuxt 3?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    SSR-friendly - значит что ты не должен об этом думать, а за тебя подумает фреймворк и сделает всё интуитивно снаружи и правильно внутри.)
    Ответ написан
    Комментировать
  • Как лучше сделать авторизацию в NUXT?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Про "очень просто" ты меня сейчас сильно насмешил. Тот же OAuth - это просто адище под капотом. Но даже в basic auth есть куча мелочей на которых можно запороться.
    В общем использовать само собой следует либу, сам ты гарантировано словишь тонну багов и дыр в безопасности, только выбирать более-менее приличную(на глазок - больше 1000 Weekly Downloads на npmjs.com и от не вызывающего подозрений автора).

    Со стороны nuxt очевидно лучше всего подойдёт https://auth.nuxtjs.org/ , со стороны laravel - хз, гугли реализацию одного из вариантов поддерживаемых auth.nuxtjs.

    Ну и прекратят поддержку либы скорее всего задолго после того как ты прекратишь поддержку и обновление разрабатываемого приложения.:)
    Ответ написан
    Комментировать
  • Как добавить параметры в query?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Нужна - сделайте. Это элементарный javascript, vue тут не при чём.
    типа этого
    function concatenateFieldValue(previous, value) {
      if (typeof value !== 'string')
        value = String(value);
      if (!previous)
        return value;
    
      const uniqueValues = splitFieldValues(previous);
      uniqueValues.add(value.trim());
    
      return [...uniqueValues].join(' ');
    }
    
    function splitFieldValues(values) {
      return new Set(values.split(' ').filter(Boolean));
    }
    
    function getUpdatedQuery(query, field, value) {
      return {
        ...query,
        [field]: concatenateFieldValue(query[field], value)
      }
    }
    
    
    this.$router.push({
      query: getUpdatedQuery(
        this.$route.query, 
        itemNameParent, 
        e.target.value
      )
    });
    Ответ написан
    Комментировать
  • Как во vue/nuxt запретить роутинг по условию?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    beforeEach, либо заполнять все маршруты динамически через addRoute.
    Ответ написан
  • Как для отдельного layout создать отдельный css, js и не подключать основной?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Vue поддерживает динамическую загрузку компонентов.
    Компонент подгружаемы таким образом, как и любой код подключаемый webpack'ом через динамический import(), будет лежать в отдельном js файле, который подгрузится только когда попросят.

    Также можно настроить Vue pages, тогда код будет разбит на один общий файл js где лежит всё что используется на каждой странице и отдельные файлы для каждой страницы.

    Можно совмещать.)
    Ответ написан
    Комментировать
  • Можно ли восстановить папку проекта из папки dist?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Теоретически - это возможно. На практике - никто нужного софта(декомпилятора) не писал за отсутствием спроса. Ты можешь с помощью мощных beautifier'ов типа jsnice привести код к боль-мене читаемому виду, но от исходника это будет бесконечно далеко.

    Лучше смотри в сторону софта для восстановления файлов типа recuva и, возможно, восстановления local history в ide.
    Ответ написан
    Комментировать
  • В чем преимущество использования в NUXT asyncData на страницах, вместо обработки в хуках (по типу async beforeMount)?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Пока asyncData не отработает - компонент не отрендерится и не замнотируется.
    При стандартном подходе компонент сначал рендерит заглушку, потом грузит данные, потом рендерит что-то на основе данных, при asyncData он ничего не делает пока нет данных. Это удобнее.
    Увы asyncData не идеальна, из-за архитектуры vue-router(я в своё время глубоко разбирался, увы без полного переписывания vue-router особо лучше не сделаешь), но всё равно удобней чем делать то же самое руками.
    Ответ написан
    2 комментария
  • Как исправить ошибку "No index signature..." при обращении к свойствам объекта?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    const queryKey: AuthMessagesKeys = queryObject.message

    Это сработает, но не надёжно - потому что может упасть в рантайме если в message прилетит что-то левое.
    Лучше написать тайпгард, типа
    function isAuthMessagesKey(str: string): str is AuthMessagesKeys {
      return ['login', 'logout', 'session'].includes(str); 
    }

    и делать проверку перед использованием.
    Ответ написан
    Комментировать
  • Почему выдает ошибку Nuxt + TypeScript?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Вы использовали инструкцию или просто рандомно подключили TypeScript к Nuxt?
    Дело в том, что Nuxt много чего подключает неявно, в т.ч. и роутер, и потому TypeScript не знает о том, что в типе Vue появились дополнительные свойства типа $route. Надо отдельно подключать декларации вручную, либо следовать инструкции выше.
    Ответ написан
    Комментировать