• Как добавить/ удалить класс каждые 3 секунды в Vue?

    0xD34F
    @0xD34F Куратор тега Vue.js
    const blocks = ref(Array.from({ length: 5 }, (_, i) => (-~i) ** 2));
    const active = ref(0);
    
    function next() {
      active.value = (active.value + 1 + blocks.value.length) % blocks.value.length;
    }
    
    let intervalId = null;
    onMounted(() => intervalId = setInterval(next, 500));
    onUnmounted(() => clearInterval(intervalId));

    <div
      v-for="(n, i) in blocks"
      v-text="n"
      :class="[ 'box-item', { active: i === active } ]"
    ></div>

    Конечно, зашивать в стили цвета блоков и их количество - все эти :nth-child - не круто. Лучше сделать компонент, принимающий массив цветов и создающий блоки на его основе. Соответственно, вместо класса будет назначаться цвет фона напрямую, как-то так:

    <div
      v-for="(n, i) in colors"
      :style="{ backgroundColor: i === active ? n : '' }"
      ...
    Ответ написан
    2 комментария
  • Почему подвисают дочерние компоненты vue?

    @null_object
    Тормозить начинает из-за большого количества нод в dom дереве. Решается использование "виртуального скролла", суть которого заключается в отрисовки только видимых элементов.

    Подробнее - https://www.patterns.dev/vanilla/virtual-lists

    Утилита для Vue - https://vueuse.org/core/useVirtualList/
    Ответ написан
    1 комментарий
  • Почему не делают табы радио-кнопками?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега HTML
    Семантично делать их ссылками.
    Радио-кнопки предполагают наличие формы, оборачивать табы в форму нелогично, так что вам кажется неправильно.
    Ответ написан
    5 комментариев
  • Не могу удалить элемент input из списка - всегда удаляется последний?

    0xD34F
    @0xD34F Куратор тега Vue.js
    v-for="(address, i) in form.addresses_to" :key="i"

    всегда удаляется последний

    Конечно последний. Индекс в качестве ключа - хуже, чем ничего. Индекс ключом быть не может, думаете, что ключи есть, а на самом деле их нет. А если ключей нет, то

    Vue использует алгоритм, минимизирующий перемещение элементов

    Т.е., было в массиве N значений, на основе которых создано N элементов. Одно значение из массива выкидывается, значит, и элементов должно остаться N - 1. Какой удалить проще всего? - последний, не надо будет перемещать элементы, расположенные за ним.

    Сделайте нормальные ключи - добавьте объектам address свойства id, имеющие уникальные значения, и используйте их в качестве ключей.
    Ответ написан
    Комментировать
  • Как отследить запросы?

    @risejs
    if (response.status == 200) {
       // ...
    } else {
       // ...
    }
    Ответ написан
    Комментировать
  • Можно ли как либо защитить php-проект от "угона" другим наёмным программистом (фрилансером)?

    @alexalexes
    Меры безопасности такие же как и в любом коммерческом банке.
    1. Разделение информационной системы предприятия на контуры по готовности релиза: продакш (к управлению допускаются только ключевые технические специалисты компании), предпродакш (к управлению допускается только помощники ключевых технических специалистов, в контуре могут испытываться как тестовые данные, так и часть боевых данных), дев-контур для разработчиков (допускаются разработчики только по узкому направлению, в контуре циркулируют только тестовые данные).
    2. Разделение информационной системы предприятия по функционалу и делегирование прав доступа от рядового разработчика к ключевому специалисту в рамках одной подсистемы. Разработчики и их руководители должны иметь только те права доступа, которые необходимы для текущей работы.
    Ответ написан
    1 комментарий
  • Можно ли передавать CSS классы через props?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Передавать класс в props можно, многие библиотек так делают, но осторожно и только когда без этого не обойтись.

    Особенно стоит обратить внимание на это при использовании scoped стилей: переданный внутрь класс не будет работать сам по себе, т.к. привязан к scope родительского компонента, придётся использовать псвевдоселектор :deep(), а это уже чревато коллизиями.

    Лучше же разбить всё на максимально небольшие компоненты с простыми api конфигурации и повсеместно использовать слоты, чтобы такие вещи не требовались слишком часто.
    Ответ написан
    2 комментария
  • Как спроектировать архитектуру проекта использующего Vue3 и API module pattern?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Ну так не надо делать кашу.)

    Используйте только то что нужно, когда нужно:
    Ответ на запрос к api нужен только в рамках компонента? Просто запрашивайте в рамках компонента.
    Ответ должен быть использован в нескольких не связанных местах? Используйте стор(pinia или любой иной).

    Как ты собрался "обернуть все запросы в composable" - непонятно. Composable нужны для работы с логикой компонента, запросы api никак с этим не связаны, они просто поставляют данные. Если с этими данными потом уже нужна какая-то хитрая работа - тогда можно делать composable, который просто внутри себя будет использовать твои отдельные api модули. Смешивать всё в кучу точно не нужно.

    P.S. Composable - это не какая-то особая тумба-юмба, если не очевидно, это просто обычные функции. От любых иных они отличаются только тем, что внутри себя используют vue-хуки(тоже просто функции), а потому привязаны к компоненту внутри которого вызываются и не могут работать вне компонента.

    P.P.S. Те кто рекомендуют пихать запрсы в стор - долбоёбы. Были во времена vue2 остались и сейчас. Стор - это хранилище, он хранит. Работа с api должна быть от него отделена, иначе получится каша.
    Ответ написан
    1 комментарий
  • Vue3. Как экспортировать функцию из компонента?

    Fragster
    @Fragster
    помогло? отметь решением!
    нужно выставить наружу нужные свойства и методы:
    https://vuejs.org/api/sfc-script-setup.html#define...
    А потом снаружи обращаться через указание ref в качестве атрибута в шаблоне:
    https://vuejs.org/guide/essentials/template-refs.h...
    Ответ написан
    1 комментарий
  • Правильное описание типов для колонок таблицы (Typescript)?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Чтоюы union объектов работал - у него должно быть поле-дискриминатор(поле которое есть в каждом объекте и отличает его от другого), допустим type:
    type BaseColumn = { label: string; props: string }
    
    type Column = { type: 'text' } & BaseColumn
    
    type LinkColumn = { type: 'link'; path: string } & BaseColumn
    
    type TableColumn = Column | LinkColumn


    keyof для юниона объектов показывает только те поля, которые есть в каждом из них. Это логично, т.к. к типу TableColumn ты не можешь обратиться по полую .link предварительно не сузив тип. union - строгий.
    Ответ написан
    Комментировать
  • Как исправить ошибку TS при получении элемента img через ref vue 3?

    bootd
    @bootd
    Гугли и ты откроешь врата знаний!
    Потому что вы должны добавить условие, которое проверяет, что картинка существует.

    // Не пишите тут лишних типов. Юзаете картинку, оставьте только тип картинки
    const img = ref<HTMLImageElement | null>(null);


    if (img.value) {
      observer.value.observe(img.value);
    }


    Когда вы делаете ref на какой либо DOM элемент или же компонент, это не значит, что он существует в DOM дереве. TS не умеет определять, существует ли html или нет.

    P.S. Читайте ошибки, он вам там чёрным по белому пишет, что помимо картинки, может быть тип null, который у вас указан. А методу observe необходим существующий DOM элемент.
    Ответ написан
    2 комментария
  • В какой момент срабатывает watch во vue 3 при множественном source?

    Lastor
    @Lastor
    В чем сила, брат? В ньютонах.
    const trigger = ref(false) //for watch
    
    function somePiniaAction() {
       var1.value = "1"
       var2.value = "2"
       var3.value = "3"
       trigger.value = !trigger.value
    }
    Ответ написан
    4 комментария
  • Как сделать преобразование фурье для изображения по xy?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Что надо делать.?
    Не понимаю, с чего начать.

    Вообще если у тебя так много непоняток - то начни не с изображений а с 1-мерного графика.
    Курс валют например. Или ход температуры за сезон. Разберешся - дальше пойдешь.
    А если ты сейчас даже какую-то фигню закодишь
    - то как ты проверишь что правильное преобразование сделал?

    Начни с контракта. Что приходит тебе на вход? Вот это вот
    double[] x, double[]y

    С моей точки зрения - тут должна быть картинка. Image. На следующем уровне ты ее разбиваешь
    на цветовые слои. Красный зеленый ит.д. Потом эти слои разбиваешь на фреймы (8х8 пикс как в jpg).
    Потом их нормируешь от цвета пиксела до вещественного значения. И вот уже когда ты получишь
    матрицу вещественных значений - тогда и можно приступать к Фурье. Усек? У тебя хедер
    функции должен иметь такие параметры чтобы тебе было все кристально ясно что за аргументы и как.

    А так конешно у тебя каша в голове.

    Да. И по контракту Фурье преобразования ты получаешь комплесную
    вещественную матрицу на выходе. Тоесть две матрицы. Размер их не обязательно должен быть 8х8.
    Он может быть любым. Но обычно нижние коэффициенты матрицы (левый верхний угол - самые
    ценные для Фурье формулы).

    И дальше - делаешь все в обратном направлении. От Фурье к картинке. Получиться картинка - молодец.
    Значит правильно сделал.
    Ответ написан
    5 комментариев
  • Почему bottom:0 не работает?

    sfi0zy
    @sfi0zy Куратор тега CSS
    Creative frontend developer
    Использование position: relative совместно со свойствами top, right, bottom или left смещает элемент относительно его естественного расположения на странице. Поэтому все работает так, как и должно. Ваш main естественным образом расположен в верхней части родителя и смещен на 0px. Ну то есть никуда не смещен.

    Вероятно вы получите нужное вам поведение если будете использовать position: absolute.
    Ответ написан
    Комментировать
  • Какую базу данных использовать для такого проекта?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Тут подходит любая реляционная SQL БД потому что нет противопоказаний. Реляционку мы выбираем
    уже более 30 лет как default вариант и почти не ошибаемся.

    Когда задача имеет признаки ярко выраженной high-load системы - мы делаем ей частичную денормализацию
    и раскладываем ее в NoSQL Key-Value решение. Но это не про улучшение а это про неизбежность. У нас нет выхода просто.
    Иначе мы клиенту не сможем быстро отдать какой-то резуальтат.

    Когда задача имеет ярко выраженную документную природу (нет спецификации на values) - мы берем MongoDb/CouchDb.

    Когда задача хранит граф и ищет в графе и вообще требует графовых алгоритмов - то мы берем Neo4j или ей подобные.

    Когда задача хранит данные измерений (телеметрия) - то предпочтительно взять InfluxDb или ей подобные. Здесь-же мы предполагаем что у нас - не будет joins а будет только измерения в диапазоне времени.

    Но в данном ТЗ и на картинке обычная SQL БД (MySQL/Postgres) вполне себе нормально справляется.
    Ответ написан
    Комментировать
  • Как сделать, чтобы с помощью input можно было производить поиск(в моем случае книг, каждая книга-отдельный объект json в js файле)?

    Mike_Ro
    @Mike_Ro Куратор тега JavaScript
    Python, JS, WordPress, SEO, Bots, Adversting
    // get DOM elements
    const searchInput = document.getElementById('searchInput');
    const resultsContainer = document.getElementById('resultsContainer');
    
    // search from array
    function searchBooks(query) {
        return CLASS5.filter(book => {
            return book.query.toLowerCase().includes(query.toLowerCase())
                || book.athor.toLowerCase().includes(query.toLowerCase())
                || book.pages.toLowerCase().includes(query.toLowerCase())
                || book.age.toLowerCase().includes(query.toLowerCase())
                || book.classn.toLowerCase().includes(query.toLowerCase());
        });
    }
    
    // print
    function displayResults(results) {
        resultsContainer.innerHTML = '';
    
        if (results.length === 0) {
            resultsContainer.innerHTML = '<p>Ничего не найдено...</p>';
            return;
        }
    
        results.forEach(book => {
            const bookCard = document.createElement('div');
            bookCard.innerHTML = `
                <h2>${book.query}</h2>
                <p>${book.athor}</p>
                <p>${book.pages}</p>
                <p>${book.age}</p>
                <p>${book.classn}</p>
                <img src="${book.images}" alt="Book Image">
            `;
            resultsContainer.appendChild(bookCard);
        });
    }
    
    // handler
    searchInput.addEventListener('input', (event) => {
        const query = event.target.value;
        const results = searchBooks(query);
        displayResults(results);
    });
    Ответ написан
    4 комментария
  • Как сделать чтобы PHP скрипт по завершении работы отправлял на фронт уведомление?

    vabka
    @vabka
    Токсичный шарпист

    Или например при выполнении скрипта на бэке записывать в базу результат а фронт будет через 5 минут спрашивать бэк все ли готово?

    Этот вариант в любом случае придётся реализовать, тк ты не можешь гарантировать, что всё время от запроса до итогового результата у пользователя будет работать сеть.

    Я рекомендую всётаки озадачиться вебсокетами, тк это сейчас наиболее стандартный спобом общения клиента с сервером в реальном времени.

    Без вебсокетов можно попробовать server sent events, но лично я никогда ихне пробовал и не знаю подводных.
    Ответ написан
    Комментировать
  • Не давно начала изучать VUE, какие компоненты правильные?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Правильно так, как вам удобно.

    А ещё, чтобы научиться делать правильно, надо сперва сделать неправильно.

    Так что реализовываете все варианты, какие только сможете придумать.

    Если в реализованном что-то не устраивает, всегда можно оформить вопрос (конечно, сперва погуглив) - вот есть такой-то компонент, решает такую-то задачу, мне в нём не нравится то-то и то-то, какие есть способы сделать лучше?

    Когда решите таким образом задач сорок-пятьдесят, начнёт приходить понимание, как делать правильно.
    Ответ написан
    Комментировать