Skip to content

Hotfix/select model value emission#1068

Merged
jvictordev1 merged 2 commits intomainfrom
hotfix/select-model-value-emission
Mar 12, 2026
Merged

Hotfix/select model value emission#1068
jvictordev1 merged 2 commits intomainfrom
hotfix/select-model-value-emission

Conversation

@lucasn4s
Copy link
Collaborator

Por favor, verifique se o seu pull request está de acordo com o checklist abaixo:

  • A implementação feita possui testes (Caso haja um motivo para não haver testes/haver apenas testes de snapshot, descrever abaixo)
  • A documentação no mdx foi feita ou atualizada, caso necessário
  • O eslint passou localmente

1 - Resumo

  • Impede que seja emitido o valor nulo ao selecionar uma opção no componente Select

2 - Tipo de pull request

  • 🧱 Novo componente
  • ✨ Nova feature ou melhoria
  • 🐛 Fix
  • 👨‍💻 Refatoração
  • 📝 Documentação
  • 🎨 Estilo
  • 🤖 Build ou CI/CD

3 - Esse PR fecha alguma issue? Favor referenciá-la

4 - Quais são os passos para avaliar o pull request?

  • Abra a documentação atual do componente, expanda a parte de logs e selecione qualquer opção do select;
  • Verifique que, ao clicar, serão exibidos 2 emissões do evento update:modelValue, a primeira com o valor null e a segunda com o valor da opção que você selecionou;
  • Agora vá para este branch e repita o processo;
  • Verifique que agora só é emitido 1 evento, como esperado;
  • Deixe seu like e se inscreva no canal.

5 - Imagem ou exemplo de uso:

6 - Esse pull request adiciona breaking changes?

  • Sim
  • Não

@github-actions github-actions bot added the 🐛 Bug Algo não está funcionando label Mar 12, 2026
@greptile-apps
Copy link

greptile-apps bot commented Mar 12, 2026

Greptile Summary

Este PR corrige o disparo duplo do evento update:modelValue no componente Select, onde null era emitido imediatamente antes do valor correto toda vez que o usuário selecionava uma opção.

Causa raiz: a função hide() (chamada no blur do input) continha a condição !searchString.value && !props.addable, que era verdadeira mesmo quando o blur ocorria após uma seleção legítima, zerando o model antes que o watcher de localValue pudesse emitir o valor real.

Mudanças principais:

  • hide(): substituição da condição de limpeza por shouldClearSelection (searchable && !addable && localOptions.length === 0), que dispara corretamente apenas quando o usuário pesquisou algo mas não encontrou nenhuma opção — agora também atribuindo localValue.value = null para manter os dois estados sincronizados.
  • watch(localValue, ...): remoção de { deep: true } (segura, pois localValue.value é sempre reatribuído como um todo) e adição de verificação via compatibleOptions para garantir que o model só é atualizado quando o novo valor realmente existe em localOptions, evitando emissões de valores intermediários ou inválidos.
  • package-lock.json bumpeado de 3.154.9 para 3.154.11 corrigindo uma inconsistência pré-existente com o package.json.

Confidence Score: 4/5

  • PR seguro para merge — a lógica do fix é correta e bem delimitada.
  • A correção endereça diretamente a causa raiz do duplo disparo. Os edge cases (selects não-searchable, addable, com deep search) foram analisados e permanecem funcionando corretamente. A única ressalva é a inconsistência pré-existente no package-lock.json, que este PR resolve como efeito colateral.
  • Nenhum arquivo requer atenção especial além das notas acima.

Important Files Changed

Filename Overview
src/components/Select.vue Correção do duplo disparo de update:modelValue — a função hide() não emite mais null ao fechar o dropdown sem busca, e o watcher de localValue agora só propaga ao model quando o valor existe em localOptions. A remoção de deep: true é segura pois localValue.value é sempre reatribuído diretamente.
package.json Bump de versão de 3.154.10 para 3.154.11.
package-lock.json Bump de 3.154.9 para 3.154.11, pulando 3.154.10 — indica que o package-lock.json estava desatualizado em relação ao package.json (3.154.10) no branch main antes desse PR.

Sequence Diagram

sequenceDiagram
    participant User
    participant Input
    participant hide()
    participant watch(localValue)
    participant model

    Note over User,model: Fluxo ANTES do fix (bug)
    User->>Input: clica na opção (mousedown → selectItem)
    Input->>Input: localValue.value = cloneDeep(opção)
    Input->>hide(): blur dispara hide()
    hide()->>model: model.value = null ❌ (1ª emissão)
    watch(localValue)->>model: model.value = opção ✅ (2ª emissão)

    Note over User,model: Fluxo DEPOIS do fix
    User->>Input: clica na opção (mousedown → selectItem)
    Input->>Input: localValue.value = cloneDeep(opção)
    Input->>hide(): blur dispara hide()
    hide()->>hide(): shouldClearSelection = false (há opções)
    hide()->>Input: localValue.value mantido (opção existe em localOptions)
    watch(localValue)->>watch(localValue): compatibleOptions encontrado ✅
    watch(localValue)->>model: model.value = opção ✅ (única emissão)
Loading

Comments Outside Diff (1)

  1. src/components/Select.vue, line 543-556 (link)

    Limpeza de seleção apenas quando não há opções filtradas

    A nova condição shouldClearSelection (props.searchable && !props.addable && localOptions.value.length === 0) é mais precisa do que a antiga (!searchString.value && !props.addable), que limpava o model em todo blur de um select não-addable — incluindo no clique em uma opção —, causando o duplo disparo relatado.

    Um ponto de atenção: localOptions.value referenciada aqui ainda é a lista filtrada (a restauração para pristineOptions ocorre apenas no nextTick mais abaixo na mesma função). Esse comportamento é intencional e correto para determinar se o usuário pesquisou e não encontrou nada, mas vale deixar um comentário inline no código para evitar confusão futura.

    Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

Last reviewed commit: bdee403

@jvictordev1 jvictordev1 merged commit 217084a into main Mar 12, 2026
9 checks passed
@jvictordev1 jvictordev1 deleted the hotfix/select-model-value-emission branch March 12, 2026 16:22
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🐛 Bug Algo não está funcionando

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants