Задать вопрос
  • Почему возникает такая ошибка NEXT JS 13?

    Aetae
    @Aetae
    Vladislav Ivanov, "здесь" у тебя обычная функция. Она не использует в себе хуки (use<some>), а потому может вызываться когда хочешь.

    Хуки привязываются к компоненту в момент его создания, они должны быть вызваны внутри него и сразу. Если утрировать то хуки тупо опираются на глобальную переменную которая ставится со стартом компонента и убирается после, типа:
    // отрисовка компонента внутри React
    globalCurrentState = globalCurrentStateMap.get(Component);
    globalCurrentStateIndex = 0
    Component(...arguments)
    globalCurrentState = null
    globalCurrentStateIndex = null
    
    // хук useState
    function useState(stateValue) {
      // увеличиваем индекс хука относительно компонента на единицу
      globalCurrentStateIndex++;
      // получаем массив state для текущего вызова useState
      let stateArray = globalCurrentState[globalCurrentStateIndex];
      
      
      if (stateArray) { // если уже есть - просто возвращаем
        return stateArray;
      } else { // иначе
        // создаём setValue
        function setValue(newValue) {
          stateArray[0] = newValue;
        }
        // создаём массим state
        stateArray = [stateValue, setValue];
        
        // записываем в глобальную переменную
        globalCurrentState[globalCurrentStateIndex] = stateArray;
        
        // отдаём
        return stateArray;
      }
    }


    Очевидно, что "когда-то потом", когда submitData будет вызван - все глобальные переменные уже десять раз будут переопределены другими компонентами.

    Конечно там всё намного сложнее под капотом, но основную суть этот код иллюстрирует.

    В общем просто запомни: если внутри твоей функции используется хук(use<some>), то и сама функция становится хуком и не может работать вне корня компонента.
  • Почему возникает такая ошибка NEXT JS 13?

    Aetae
    @Aetae
    Vladislav Ivanov, т.е. это всё-таки хук? Переименуй в useRegisterService чтоб людей не путать.
    А ошибка твоя в том, что хуки работают в компоненте. Не когда-то потом, когда submitData произойдёт, а при создании и последующих рендерах.
    Это в принципе очевидно, если понимать как это всё работает, а не относится как к шайтан-машине.
  • Почему возникает ошибка в коде?

    Aetae
    @Aetae Куратор тега JavaScript
    Во-первых: оберните код в <code></code>.
    Во-вторых: какая ошибка то?
  • Почему не полностью работают подсказки (не видят наследования) в VSCode?

    Aetae
    @Aetae Куратор тега JavaScript
    Михаил Оловянников, нет, это особенность vscode.
    В webstorm, например, всё нормально: 64e22e9b72b19610370677.png

    В любом случае, в современном js не рекомендуется полагаться на встроенные методы объекта, т.к. может в вашу функцию прилететь объета с нулевым прототипом(Object.create(null)). Например вместо newObject.hasOwnProperty('name') рекомендуется Object.hasOwn(newObject, 'name').
  • Как отличить подключения через "приложения" и по url в NW.js?

    Aetae
    @Aetae
    Только с этим поосторожнее, а то была статья тут как вумные сервера-прокладки проблёскивали ip юзера не настоящий, а, если есть, получая его из хэдера X-Forwarded-For(который ставят прокси). Всё бы нормально, пока на сайт не зашёл чувак с X-Forwarded-For 127.0.0.1 и внезапно не попал в админку.:)
  • Почему возникает ошибка Cannot read properties of null (reading 'hasOwnProperty')?

    Aetae
    @Aetae Куратор тега JavaScript
    mbhusty, ну значит твой код виноват. Где-то ты кладёшь dataLayer в vue. Если vue 2, то dataLayer автоматически при этом становится объетом vue, на изменения в котором ты где-то подписываешься и делаешь такую бяку. Или это делает какой-то плагин. Х.з. Без всего кода сложно сказать.
  • Как правильно спроектировать сервис лицензирования?

    Aetae
    @Aetae
    Ну на самом деле самое злое, что можно сделать - вынести часть кода программы на сервер. Не полноценный онлайн сервис, чтоб сервер зря не грузить, просто какой-нибудь легко обрабатываемый но необходимый кусочек кода, желательно такой чтоб отреверсить чисто по выводу легко не получилось.:)

    Вообще конечно киберпанк так и прёт, прям вижу класичексий DataCrash когда все дрм сервера просто сдохнут и человечество откатится на 50-100 лет назад тупо из-за невозможности ничего использовать.:)
  • Как прописать условное форматирование для автоматического выделения ячеек в Google таблице в которых есть повторяющиеся элементы?

    Aetae
    @Aetae
    Ну на самом деле макрос сможет отличать ровно то, чему вы его научите.
    Те же имена и определённые цифры вытянуть не проблема с минимальными погрешностями. А потом можно и перелинковать их перекрёстными ссылками и на отдельную страничку по столбцам разложить. (но я этого делать, конечно же, не буду)

    Однако да, гораздо лучше с самого начала раскладывать всё по столбцам нормально.
  • Как переиспользовать компонент в модульной архитектуре?

    Aetae
    @Aetae
    WbICHA, если код разный - то это уже не копирование.)

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

    P.S. Да, лично я в плане копирования кода весьма радикален: не могу вынести больше пары строк одинакового кода не обобщив, а любой boilerplate, особенно счищающийся стандартом, вызывает у меня припадки неконтролируемой ярости. Я знаю, что это не очень здоро́во, но что уж тут. :)
  • Как переиспользовать компонент в модульной архитектуре?

    Aetae
    @Aetae
    Слишком мало информации. Где, что, на чём - ничего не ясно.
    В любом случае копирование кода - это плохо. По-хорошему надо просто вынести этот компонен "выше" и истользовать спокойно в обоих случаях.
    Нюансы начинаются если нет этого "выше". Тут к каждому случаю нужен персональный подход. Например, если это два совершенно разных приложения связанных только UI-библиотекой, а компонент слишком специфичен для этой библиотеки, то заводить отдельную либу только под компонент уже может получиться накладно и тогда можно копипастить пока так одно не перевесит другое.
  • Как решить проблему с переходом между страницами при использовании кнопок сохранения в форме с AJAX?

    Aetae
    @Aetae Куратор тега JavaScript
    Проблема скорее всего на бэке. loction.reload перезагружает страницу(с бэка, в редких случаях из кэша), и, полагаю, с точки зрения бэка получается два(или 1 + сколько сделаешь reload) захода подряд на текущую страницу, а т.к. никакой дедупликации, судя по всему, не осуществляется, то и текущая и "предыдущая" страницы на сервере имеют адрес текущей.

    Вообще странно работать с навигацией со стороны бэка, это полностью клиентская сторона по идее.
  • Как сделать JS desktop приложение как сайт Vue js?

    Aetae
    @Aetae Куратор тега JavaScript
    Неа, не нужен.
  • Почему console.log(isNaN( )) выводит true, если под капотом пустая строка преобразовывается к 0?

    Aetae
    @Aetae Куратор тега JavaScript
    Проще всего тебе будет просто забыть об isNaN, он deprecated, работает по постулированому в спецификации языка, а не по логическому, набору правил и его использование в коде не рекомендуется.
    Есть современный Number.isNaN с гарантированным результатом(true толькоесли аргумент точно и конкретно NaN).
  • Как проверить наличие nuxt во vue3?

    Aetae
    @Aetae Куратор тега Vue.js
    Владислав Лысков, ну м.б. он пилит какой-то библиотечный компонент, который может повести себя в nuxt окружении иначе.
  • Почему не работает поиск по массиву из объектов?

    Aetae
    @Aetae Куратор тега JavaScript
    Александр Панков, что свой? Просто используй lodash с импортами и не парь мозг. Если очень хочется автоимпортов - такой "модуль" для nuxt пишется в 10 строк руками. Ну или можешь поставить prefix: false\'_'\<что угодно но не use> в конфиге модуля.
  • Как подгрузить кусок HTML с последующим выполнением скриптов в нём?

    Aetae
    @Aetae Куратор тега JavaScript
    Павел, после div.innerHTML = ...; добавь:
    div.querySelectorAll('script').forEach((sourceScript) => {
        const script = document.createElement('script');
        for(const attribute of sourceScript.attributes)
            script.attributes.setNamedItem(attribute.cloneNode(true));
        script.innerHTML = sourceScript.innerHTML;
        sourceScript.parentNode.replaceChild(script, sourceScript);
    })


    Но да, это хреновая практика.
  • Почему не работает поиск по массиву из объектов?

    Aetae
    @Aetae Куратор тега JavaScript
    Александр Панков, охренеть, 6к юзеров при том что модуль, абсолютно очевидно, делал долбоёб который вообще нихерна не понимает в vue(или, хотя бы, react).
    Префикс use зарезервирован за функциями которые работают с компонентом и должны вызываться только в секции setup(иначе работать не будут). Использование его не по назначению захламляет код и затрудняет его чтение адекватными людьми.
  • Почему не работает поиск по массиву из объектов?

    Aetae
    @Aetae Куратор тега JavaScript
    Функция lodash называется findIndex, что за ересь useFindIndex - неизвестно.
  • Почему не работает функция клика по resource id через adb?

    Aetae
    @Aetae Куратор тега JavaScript
    Раз не найден - значит не найден, duh.
    Смотрите, что у вас там в xmlDump и сравнивайте с тем, что ищет регулярка.

    Кстати, криво сделана регулярка - не экранируются спецсимволы в resourceId. В данном конкретном случае на результат оно влиять не должно, но на будущее стоит пофиксить, вот вам простая функция для этого:
    function escapeRegExp(string) {
      return String(string).replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); 
    }
  • Как подменить файл звука на свой в HTML?

    Aetae
    @Aetae Куратор тега JavaScript
    Markella, как бонус можно ещё так вытянуть звук больше максимума:
    const source = document.querySelector('source[src="/msg.mp3"]')
    source.src = "data:audio/mpeg;base64,<и т.д. то что получено в сервисе data uri>";
    const audio = source.parentNode;
    audio.load();
    audio.volume = 1;
    
    const audioContext = new AudioContext();
    const gainNode = new GainNode(audioContext, { gain: 10 });
    
    audioContext
        .createMediaElementSource(audio)
        .connect(gainNode)
        .connect(audioContext.destination);

    Где gain - множитель.(правда больше 6 уже обычно не имеет особого смысла, т.к. врезается в железные возможности)
    Скорее всего это не понадобится, но на всякий случай.