Задать вопрос
  • Как выровнять в гриде по горизонтали?

    @7rows
    Frontend Разработчик / Vue / JS / TS / CSS
    justify-items - выравнивает элементы внутри их ячеек
    justify-content - выравнивает всю сетку по горизонтали

    Вот ссылка
    https://doka.guide/css/grid-guide/

    Либо вы как-то не так задали вопрос, либо покажите полный код, что вы хотите.
    Ответ написан
    Комментировать
  • Как отследить повторный клик по элементу?

    @7rows
    Frontend Разработчик / Vue / JS / TS / CSS
    Проблема в том, что вам нужно отслеживать состояние конкретной кнопки, а не только предыдущий массив.

    Примерно, как-то так будет

    data() {
      return {
        activeItems: [],
        lastClickedId: null
      }
    },
    
    methods: {
      click(items, buttonId) {
        const itemsArray = Array.isArray(items) ? items : [items];
        
        // Если кликаем второй раз по той же кнопке
        if (this.lastClickedId === buttonId) {
          this.activeItems = [];
          this.lastClickedId = null;
        } else {
          this.activeItems = itemsArray;
          this.lastClickedId = buttonId;
        }
        
        this.applyStyles();
      },
      
      applyStyles() {
        for (let node in this.nodes) {
          this.nodes[node].style.opacity = this.activeItems.includes(node) ? 1 : 0.3;
        }
      }
    }
    
    
    
    В коде при событии клик, передавай и id   @click="click(button.items, button.id)" - который как раз является индексом
    Ответ написан
    Комментировать
  • На какое событие жизненного цикла в компонент приходят новые пропсы?

    @7rows
    Frontend Разработчик / Vue / JS / TS / CSS
    Есть события жизненный цикл у компонента, однако, явного иструмента , который следи за props нет, они по умолчанию реактивны.
    Если вам надо явно отследить изменения именно пропсов, предполагаю, у вас там вложенный объект, то вам нужен watch с опцией immediate, и вы явно можете отследить изменения и сделать что-то с ними, так как, не всегда изменения пропсов, затрагивают изменение обновления компонента и его перерисовку
    Ответ написан
    Комментировать
  • Как дождаться полной загрузки файла перед загрузкой следующего?

    @7rows
    Frontend Разработчик / Vue / JS / TS / CSS
    Проблема в том, что все fetch запросы запускаются параллельно, и filePosition вычисляется до того, как предыдущие файлы успевают добавиться в массив. Вот несколько способов решения:

    // В дочернем компоненте - передаем все файлы сразу
    attachThumbnail: function (e, curObj) {
      e.target.closest('.area-upload').classList.remove('drag-file');
      e.target.closest('.area-upload').style.display = 'flex';
    
      let files = e.target.files || e.dataTransfer.files;
      let allowFiles = this.validateFiles(e, files, curObj);
    
      this.$emit('attachThumbnail', curObj, Array.from(allowFiles));
    },
    
    // В родительском компоненте - обрабатываем последовательно
    async attachThumbnail(curObj, files) {
      let index = this.formData.materialFiles.findIndex(item => item.lang === curObj.lang);
      
      for (let i = 0; i < files.length; i++) {
        let file = files[i];
        let filePosition = this.formData.materialFiles[index].files.restFiles.length;
    
        console.log('Array length ' + filePosition);
    
        try {
          const response = await this.uploadFile(curObj, file, 'rest', filePosition);
          const data = await response.json();
          
          console.log('append file');
          this.formData.materialFiles[index].files.restFiles.push({
            name: data.fileName,
            id: data.id
          });
        } catch (error) {
          console.log(error);
        }
      }
    }


    Примерно как-то так
    Ответ написан
    Комментировать
  • Как глубоко сравнить копию реактивного объекта и реактивный объект Vue 2?

    @7rows
    Frontend Разработчик / Vue / JS / TS / CSS
    Кажется я понял о чем вы.
    Так обычно делают для того, чтобы сравнить, были ли изменения в форме и показать окно выхода.

    Судя по всему, у вас 2vue.
    На моменте инициализации, что мешает вам скопировать объект, сохранить его исходные данные и написать метод useCompare, который как раз, будет через cloneDeep сравнивать оригинал с тем, что было изменено.

    Далее, на вотчкер смотрит за стейтом и сравнивает с оригиналом скопированным.
    Скорее всего, у вас комирование идет по ссылке и значения у вас идентичные.

    Но, если объект слишком глубокой вложенности, то, кажется, вы что-то делаете не так,
    Ответ написан
    Комментировать
  • Как сделать модальное окно, которое всегда рядом с кнопкой, его вызывающей?

    @7rows
    Frontend Разработчик / Vue / JS / TS / CSS
    Вот решение
    В библиотеках это называется контекстное меню, можно самому сделать, как писали выше, через floating-ui, либо через готовые библиотеки
    Ответ написан
    Комментировать
  • Почему выдает выдает ошибку при изменении ИБ битрикс?

    @7rows
    Frontend Разработчик / Vue / JS / TS / CSS
    Вы пересоздавали индексы , после того, как копировали ?
    Убедитесь, что привязки в новом разделе не ведут на старые ИБ
    Ответ написан
    Комментировать
  • Блоки с товарами на главной АСПРО?

    @7rows
    Frontend Разработчик / Vue / JS / TS / CSS
    А что мешает вам вывести компонент и указать у него количество ?
    У вас все эти компоненты лежат в index.php
    Ответ написан
  • Как сделать расширенную область при наведении курсора?

    @7rows
    Frontend Разработчик / Vue / JS / TS / CSS
    Хмм, а что мешает тебе подставить в эту иконку какой-то слой, типа

    А дальше, слушателем на позицию мышки делать подсветку при наведении, радиус ты можешь вычислить сам.
    Пришли всю иконку или сделай ссылку, так непонятно, что ты хочешь. Соседние точки , ты можешь вычислить по
    https://developer.mozilla.org/en-US/docs/Web/API/S...

    Пример определения
    function getMousePosition(evt) {
          const CTM = svg.getScreenCTM();
          return {
            x: (evt.clientX - CTM.e) / CTM.a,
            y: (evt.clientY - CTM.f) / CTM.d
          };
        }
    Ответ написан
    Комментировать
  • Как корректно реализовать работу с таймерами?

    @7rows
    Frontend Разработчик / Vue / JS / TS / CSS
    Рекомендую рассмотреть библиотеку Interval

    Вот по таймеру
    Time out

    библиотека очень мощная и много чего уже сделано
    Ответ написан
    Комментировать
  • Можно ли вернуть помимо статической страницы данные с сервера?

    @7rows
    Frontend Разработчик / Vue / JS / TS / CSS
    Как вариант, ранее на PHP делали следующее, при рендере страницы, можно создать некий атрибут и туда класть данные, и потом с ним работать, такой подход делал Bitrix в свое время, чтобы передать данных из сервера в js
    Ответ написан
    Комментировать
  • Как определить значение в unit-тесте?

    @7rows
    Frontend Разработчик / Vue / JS / TS / CSS
    Судя по этой ссылке
    Там говорится, что , внутри компонента vue надо использовать
    $q.platform.is.cordova

    Usage inside a Vue component JS:
    import { useQuasar } from 'quasar'
    
    setup () {
      const $q = useQuasar()
    
      $q.platform.is.mobile
    }


    Usage inside a Vue component template:
    $q.platform.is.cordova

    You must import it when you use it outside of a Vue component :
    import { Platform } from 'quasar'
    Ответ написан
    Комментировать
  • В чем разница между асинхронным и статичным импортом в vue3?

    @7rows
    Frontend Разработчик / Vue / JS / TS / CSS
    Суть в том, что , асинхронный компонент подгрузится тогда, когда будет выполнено условие и изначально бандл будет меньше.
    Статичный - у тебя компонент сразу будет в сборке, и не важно, будет ли условие использовано или нет.

    Когда это может выстрелить в ногу-
    Предположим, у тебя есть модальное окно, в нем у тебя через defineAsync грузится иконка, как компонент, так вот, при открытии первого раза, у тебя будет эффект мерцания, потому что, компонент загрузился и остался.
    Как лучше использовать ? ну, тут все от задачи зависит.
    Ответ написан
    Комментировать
  • Как редиректить если поменялось значение переменной (vue-router)?

    @7rows
    Frontend Разработчик / Vue / JS / TS / CSS
    Тут либо тебе поможет Watch, либо guard в РОутере

    1-
    <script setup>
    import { useRouter } from 'vue-router';
    import { computed, watch } from 'vue';
    import { useAuthStore } from '@/stores/auth'; // Пример с Pinia
    
    const router = useRouter();
    const authStore = useAuthStore();
    const userRole = computed(() => authStore.role);
    
    watch(userRole, (newRole) => {
        if (newRole !== 'admin') {
            router.push('/'); 
        }
    });
    </script>


    Тут проверка, перед переходом

    router.beforeEach((to, from, next) => {
        const hasAccess = checkUserAccess(to); 
        if (!hasAccess) {
            next('/'); 
        } else {
            next();
        }
    });
    Ответ написан
    Комментировать
  • Пытаюсь вывести title и т.д. для каждой страницы через vue3, vueuse/head, как правильно сделать?

    @7rows
    Frontend Разработчик / Vue / JS / TS / CSS
    Я бы вам посоветовал использовать nuxt, как раз, решение для того, что вы хотите, ssr + vue3
    Ответ написан
  • Как передать событие клика по пуш-уведомлению в формате Ajax для увеличения счётчика кликов?

    @7rows
    Frontend Разработчик / Vue / JS / TS / CSS
    $.ajax({
                                    url: '/ajax.php',  // URL для обработки клика
                                    type: 'POST',
                                    data: {
                                        action: 'increment_click',  // Действие для обработки
                                        notification_id: notificationDetails[i]['id']  // ID уведомления
                                    },
                                    success: function(response) {
                                        console.log('Click counter updated.');
                                    },
                                    error: function() {
                                        // Обработка ошибок, если нужно
                                        console.log('Error updating click counter.');
                                    }
                                });


    Если правильно понял, ну и на пхп теперь допиши обработку
    if ($_POST['action'] == 'increment_click' && isset($_POST['notification_id'])) {
    .....  
    
    логика обновления по инкрименту  нотификатору
    }
    Ответ написан
    1 комментарий
  • Почему объект не объект во Vue?

    @7rows
    Frontend Разработчик / Vue / JS / TS / CSS
    Что-то глянул код , у вас стоит вотч на эмит, но сам эмит не увидел, что он обрабатывается.
    В выводе компонента , вы выводите props, а меняете через switch данные в компоненте, как только вы соедините все через emit, у вас реактивность пропса будет работать.
    Можно пойти дальше, и написать компонент, который будет принимать как раз 2 v-model, и не нужно будет прокидывать пропсы, вы тем самым уменьшите 1 уровень проброса emit
    По сути, у вас на нижнем уровне данные поменялись, а родитель не увидел.
    Вам надо обработать эмит и тогда даные у пользователя обновятся
    Еще уберите вотч, если у вас можно изменение обработать по ```@change```
    Ответ написан
  • Как записать данные в глобальный стейт, что-бы сделать fetch запрос поиска во vue.js?

    @7rows
    Frontend Разработчик / Vue / JS / TS / CSS
    Вроде все верно,
    Вызываете fetchProducts внутри по клику sendData, либо прям по клику можно сразу вызвать fetchProducts и передать туда вашу строку
    Ответ написан
    Комментировать
  • Как изменять переменную из дочернего компонента vue3 в главном?

    @7rows
    Frontend Разработчик / Vue / JS / TS / CSS
    Если правильно вас понял, то есть несколько вариантов
    1- Самый очевидный
    в дочерний компонент значение получается в виде props от родителя. В дочернем компоненте делаете emit и в родителе подписываетесь на изменение пропса по этому эмиту, итого у вас 1 переменная у родителя, но вы в дочернем компоненте посылаете событие на изменение
    2- Через ref, получаете инстанс компонента и можете сделать там изменение, через какой-то метод, который будет возвращать вам true/false состояния
    3- Стор

    Но , это все избыточно, верное и правильное решение под 1 пунктом
    Ответ написан
    Комментировать
  • Как восстановить состояние vuex при изменении, удалении?

    @7rows
    Frontend Разработчик / Vue / JS / TS / CSS
    Вопрос, а зачем вы напрямую удаляете из стора ? Опиши для начала что вы хотите сделать, и зачем вам хранить в localStorage целый стейт ?
    Если хотите проверять авторизован или нет, то кладите токен, для этого не надо целую библиотеку тянуть
    Ответ написан