Задать вопрос
  • Есть ли информация бага дублирования select при динамическом изменении options в Firefox?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Это однозначно баг Фокса, без Vue его легко можно повторить так:
    <select>
      <option value="value 1">value 1</option>
      <option value="value 2">value 2</option>
      <option value="value 3">value 3</option>
    </select>
    <script>
      const option = document.querySelector('option');
      const value = option.value;
    
      setInterval(() => {
        option.setAttribute('value', value)
      }, 1000);
    </script>
    Даже на PC раскрытый select будет "мигать".

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

    Со стороны Vue можно заменить :value на :value.prop или вообще убрать :value (тогда тест option будет считаться за него).
    Но в идеале надо завести баг на Фокс.
    Ответ написан
    1 комментарий
  • Есть ли информация бага дублирования select при динамическом изменении options в Firefox?

    opium
    @opium
    Просто люблю качественно работать
    похоже на регрессию/гонку вокруг механизма из бага Mozilla 1758800 (GeckoView): native select-prompt в Firefox Android при изменении детей select закрывает и переоткрывает окно, переоткрытие иногда накладывается на старое (баг закрыт в Firefox 102, похоже не до конца). Ре-рендер у тебя идёт из-за updateCount, options.value присваивается той же ссылкой, это no-op для ref. Проверь: убери options.value = optionsDefault, оставь только updateCount++, если дубли останутся — дело не в options. Пропадут, повесь MutationObserver(childList) на select, глянь стреляет ли он на ре-рендере. Стреляет, заводи баг Mozilla со ссылкой на 1758800.
    Ответ написан
    4 комментария