• Как компонент реакта понимает, что к нему привязали хук?

    Aetae
    @Aetae
    Тлен
    Простой ответ: глобальные переменные.:)
    React просто перед самим запуском устанавливает глобальную (условно) переменную указывающую на текущий исполняющийся компонент, на которую и смотрит в сою очередь хук. Именно потому хуки нельзя использовать вне компонента.
    Вот тут я упрощённо изобразил, что дальше происходит внутри useState.

    Конечно всё намного сложнее, но основная суть именно такова. Подробнее - уже в исходники.
    Ответ написан
    2 комментария
  • Почему берет одну запись по селектору?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Для самого свежего хрома можно обойтись css:
    [role="row"]:has(.fraud) {
      background-color: #f1f7bc;
    }

    Для иных браузеров можно использовать такую извращенную классику(с оговорками):
    [role="row"] {
      position: relative;
      background-color: transparent;
    }
    [role="row"] .fraud::before {
      content: "";
      display: block;
      position: absolute;
      z-index: -1;
      top: 0;
      bottom: 0;
      left: 0;
      right: 0;
      background-color: #f1f7bc;
    }


    Ну либо использовать MutationObserver и следить за появлением новых [role="row"].
    Ответ написан
    Комментировать
  • Возможно ли на собрать такой блок на css, но что бы он тянулся в зависимости от содержимого?

    Aetae
    @Aetae
    Тлен
    Просто делаешь примитивную svg-картинку бэкграундом или встроеенно и растягиваешь на весь размер блока.

    Если хочется извращений - можно псевдоэлементом с трансформацией:
    Ответ написан
    3 комментария
  • Как и где можно фиксировать и сохранять данные до изменений в multiselect?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    В entity.selectedAccesses лежит последнее значение =\
    Ответ написан
    9 комментариев
  • Почему TS не компилирует пути для JS?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    paths в tsconfig работают только визуально. Чтобы они работали физически - надо продублирвать их в алиасы того сборщика, который вы используете.
    paths - не первичны, а вторичны: они сделаны как отражение возможностей алиасов в сборщиков, а не как самостоятельная фича.
    Ответ написан
    1 комментарий
  • Как при нажатии кнопки выводить поэтапно строки которые значение увеличивается на 1?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Для начала забудем о react и поговорим о javascript: javascript риусет ui в одном потоке, потому while - это атомарная операция. На экране ничего не отобразится пока while не закончит своё действие. Т.е. выведя 10 строк через while - ты сразу увидишь их на экране, они не будут появляться по одной. Если, конечно, не подключишь асинхронность с async и await внутри цикла.

    Теперь к react: отображение нескольких строк осуществляется с помощью массива:
    const lines = [1, 2, 3];
    
    return lines.map(line => (
      <p> {line} </p>
    ));


    Если ты хочешь, чтоб при клике добавлялась строчка, то состояние этого массива надо отслеживать, т.е. напримр положить его в state:
    function Component() {
      const [lines, setLines] = useState([1, 2, 3]);
      const addLine = useCallback(() => {
        setLines(lines => [...lines, lines.length+1])
      });
    
      return(
        <>
          <button onClick={addLine} className="button">
            addLine
          </button>
          {lines.map(line => (
            <p> {line} </p>
          ))}
        </>
    }


    Если ты хочешь, чтоб при клике постепенно добавлялась 10 строчек с задержкой, то это можно сделать с помощью setTimeout(тут я обернул его в Promise для простоты и наглядности):
    const delay = (ms) => new Promise(r => setTimeout(r, ms))
    
    function Component() {
      const [lines, setLines] = useState([]);
      const addLines = useCallback(async () => {
        let i = 0;
        while(i++ < 10) {
          await delay(1000);  
          setLines(lines => [...lines, i])
        }
      });
      return(
        <>
          <button onClick={addLines} className="button">
            addLine
          </button>
          {lines.map(line => (
            <p> {line} </p>
          ))}
        </>
      );
    }
    Ответ написан
    Комментировать
  • Как добавить аттрибут к тегу без занчения?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Одиночный тег - это active="".
    Ну и да, по возможности выкинь нафиг jq, это очень плохая практика.
    Ответ написан
    Комментировать
  • Проблема с цветом видео в разных браузерах?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Конечно сталкивались, и простого решения конкретной проблемы нет: видео это немного отдельный поток и там всегда могут быть свои настройки отображения.

    Решения есть следующие:
    1. Делать видео сразу с прозрачностью, а не с бэкграундом, современные браузеры это поддерживают:
    2. Рисовать видео на canvas, программно подгоняя фон.
    3. Накладывать SVG фильтр на видео, который погонит фон.
    Ответ написан
    Комментировать
  • Почему не работает addTag в multiselect?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Судя по документации тэг добавляется также и в модель(т.е. в entity.selectedAccesses), а не только в options(что называется у тебя value).

    С учётом слота, можно сделать примерно так:
    Ответ написан
  • Почему возникает ошибка Uncaught (in promise) DOMException: The element has no supported sources?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Мужик, просто попробуй открыть файл руками.
    Если возвращается "текущий HTML код страницы" и ошибка "The element has no supported sources" - вполне очевидно, что такого файла по такому адресу просто нет.
    Ответ написан
  • Почему при сборке библиотеки и подключения ее, выдает ошибку?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Не надо ничего "копировать из dist". В node_modules должен быть модуль, т.е. в первую очередь файлик package.json, во вторую - всё что в нём указано по тем путям которые там указаны.
    Вот когда ты делаешь npm link - открой node_modules и посмотри как должна выглядеть твоя либа(только без исходников).
    Когда ты сделаешь нормальный npm publish - токчно также всё просто скопируется в npm.
    Ответ написан
    Комментировать
  • 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 комментарий
  • Как можно ограничить скорость запроса в js?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Если у тебя по капотом хром, то наверное ты можешь использовать fetch в котором у Request body - это ReadableStream, растянув таким образом запрос настолько - насколько надо. Но это всё же не совсем то же самое что просто медленный запрос.
    Полноценного же низкоуровневого контроля над запросом никто тебе из js не даст.
    Ответ написан
    4 комментария
  • Как поменять данные в JSON не залезая в него через Python?

    Aetae
    @Aetae
    Тлен
    Начнём с того, что именно такая структура - это не валидный json.
    Если тебе приходится работать с индийскими данными - без индийских фокусов не обойтись.

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

    P.S. Конечно, если ты уверен, что новое значение всегда будет в utf8 короче или равно по длине старому, то, в принципе, возможны и точечные изменения, однако это слишком частный случай - сомневаюсь, что где-то есть либа для подобного. Если очень хочется - не сложно будет адаптировать ту же потоковую либу для нахождения позиции в файле и использовать затем стандартные средства работы с файлами для точечной перезаписи, однако выигрыш тут слишком мал, ИМХО, чтоб так заморачиваться.
    Ответ написан
    Комментировать
  • Почему при указании пути, картинка не выводиться в js?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Оно работает с содержимым изображения на низком уровне, это ради безопасности запрещено для картинок с чужого домена(кроме тех, для которых это явно разрешено со стороны сервера загловком access-control-allow-origin).
    Если слайдер и картинки будут храниться на одном и том же сайте - проблем не будет. Иначе - надо настраивать access-control-allow-origin на сервере отдающем картинки, или, если картинки чужие, делать свой прокси-сервер.
    Ответ написан
  • Почему на пк смазываются видео вк?

    Aetae
    @Aetae
    Тлен
    Обновить браузер и дрова на видуху. Если не поможет - откатить браузер и дрова на предыдущие версии.:)
    Ответ написан
    Комментировать
  • Как во 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 это можно добавить\изменить тут.
    Ответ написан
    Комментировать
  • Почему проект, собранный через vite не позволяет открыть сборку локлаьно через index.html?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Почему?
    Потому что в классическом виде это один js файл подключённый через script, а в виде модулей - это множество файлов которые дополнительно грузятся внутри script. Ограничения безопасности браузеров по разному работают в данных ситуациях.

    Что делать?
    Не открывать современные приложения локально. Просто забудь о такой возможности. Установи глобально какой-нить alive-server и запуская через него. Если надо это распространять - прилагай микросервер в комплекте или смотри в сторону всяких виндовых однофайловых вариантов\pdf.
    Ответ написан
    3 комментария
  • VUE 3 Router не видит GET параметры?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Видит, но не сразу:
    this.$watch(() => this.$route, (x) => {
      this.length = this.$route.query.length;
      this.width = this.$route.query.width;
      this.height = this.$route.query.height;
    }, {deep: true, immediate: true});

    ИМХО, это баг и надо бы завести issue им на github.
    Ответ написан
    6 комментариев
  • Как работает функция обновления в React?

    Aetae
    @Aetae
    Тлен
    Вот так утрировано выглядит внутри функция useState:
    function useState(initialValue) {
      // подсчитываем вызовы useState в компоненте
      component.useStateCount++;
    
      // если уже был вызов этого useState(т.е. это не первая отрисовка)
      if (component.useStateCount in component.useStateCache) 
        // возвращаем результат из кэша
        return component.useStateCache[component.useStateCount];
    
      // если первый вызов - подготавливаем ответ вида [state, setState]
      const useStateResult = [
        initialValue, 
        function setState(callbackOrValue) {
          // если аргумент setState - функция
          if (typeof callbackOrValue === 'function') {
            // вызываем её с предыдущем значением в качестве аргумента и присваиваем результат вызова в state
            useStateResult[0] = callbackOrValue(useStateResult[0]);
          } else {
            // иначе просто присваиваем аргумент в state
            useStateResult[0] = callbackOrValue;
          }
    
          // вызов обновления компонента
          component.updateComounent(); 
        }
      ];
    
      // добавляем в кэш
      component.useStateCache[component.useStateCount] = useStateResult;
    
      // возвращаем
      return useStateResult;
    }

    Стало понятней?
    Ответ написан
    1 комментарий