Задать вопрос
@E-Timofet

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

Всем привет! Не подскажите есть ли где-то информация по такой проблеме:
- android
- браузер Firefox
При динамическом изменении options у select, происходит дублирование "модалки" options

p.s. спасает "v-memo", но не могу найти инфу по этому багу

<script setup>
import { ref } from 'vue'
const optionsDefault = ['value 1', 'value 2', 'value 3']

const activeSelect = ref('value 1')
const options = ref(optionsDefault)
const updateCount = ref(0)

const updateOptions = () => {
  setInterval(() => {
    options.value = optionsDefault;
    updateCount.value ++;
  }, 3000)
}
</script>

<template>
  <h2>update cnt: {{updateCount}}</h2>
  <div>active value: {{activeSelect}}</div>
  <select
  v-model="activeSelect"
>
    <option
      v-for="option in options"
      :key="option"
      :value="option"
    >
    {{ option }}
    </option>
  </select>

  <hr>
  <div>
    <button @click="updateOptions">start updating</button>
  </div>
</template>


код: https://stackblitz.com/edit/vitejs-vite-mpva77aj?f...
демо: https://youtube.com/shorts/ktiLCX138YQ?feature=share
  • Вопрос задан
  • 417 просмотров
Подписаться 2 Средний 4 комментария
Помогут разобраться в теме Все курсы
  • HTML Academy
    Vue.js 3 — разработка клиентских приложений
    1 месяц
    Далее
  • Академия Эдюсон
    Frontend-разработчик + ИИ
    9 месяцев
    Далее
  • Skillfactory
    Специализация Frontend-разработчик
    9 месяцев
    Далее
Решения вопроса 1
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
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.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы