Análise do problema de conversão de null para string em parâmetros do Vue Router

Ao utilizar o Vue Router para navegação entre rotas e passar valores como parâmetros (params), um comportamento peculiar ocorre quando o valor é null: ele é automaticamente convertido para a string literal "null" na página de destino.

Reprodução do Problema

Para demonstrar o problema, considere o seguinte código para iniciar a navegação com um parâmetro params definido como null:

this.$router.push({
  name: 'user',
  params: { userId: null }
});

A configuração da rota de destino é apresentada a seguir:

{
  path: '/user/:userId',
  name: 'user',
  component: UserPage
}

Após a navegação, a URL resultante se parecerá com:

/user/null

Na página de destino, ao acessar o parâmetro:

console.log(this.$route.params.userId); // Saída: "null" (string)

Como observado, o parâmetro que originalmente era null foi transformado em uma string "null".

Análise da Causa

1. Princípio de Design do Vue Router

O Vue Router é projetado para construir URLs a partir dos params fornecidos. Como as URLs são essencialmente sequências de caracteres, todos os valores passados para params são stringificados. Quando um valor null é encontrado, ele é convertido para a string "null". Em contraste, um valor undefined resultaria na omissão do parâmetro na URL.

2. Processamento da URL e Recepção na Página

Na página de destino, o Vue Router analisa a URL e reconstrói os params. Como a string "null" já está presente na URL, o valor recebido na página é, consequentemente, a string "null", e não o tipo de dado null original.

Soluções Possíveis

Solução 1: Utiliazr query em vez de params

Se a intenção é presrevar o tipo de dado original, a abordagem recomendada é utilizar os parâmetros de query em vez de params.

this.$router.push({
  name: 'user',
  query: { userId: null }
});

// Na página de destino:
console.log(this.$route.query.userId); // Saída: null

Os parâmetros de query mantêm o tipo de dado original sem sofrer stringificação.

Solução 2: Pré-processar o valor null antes da navegação

Outra alternativa é manipular o valor null antes de iniciar a navegação, substituindo-o por um valor como uma string vazia ou undefined. O tratamento posterior na página de destino seria necessário.

this.$router.push({
  name: 'user',
  params: { userId: null ?? '' } // Ou use undefined
});

No componente de destino:

const idFromParams = this.$route.params.userId;
const actualUserId = (idFromParams === '' || idFromParams === undefined) ? null : idFromParams;

Solução 3: Interpretar a string "null" na página de destino

Se for imperativo manter o uso de params, é possível realizar a conversão explícita na página de destino.

const idParam = this.$route.params.userId;
const actualUserId = (idParam === 'null') ? null : idParam;

Dessa forma, se o valor for a string "null", ele será convertido de volta para o tipo null.

Conclusão

A conversão de null para a string "null" ao usar params no Vue Router é uma consequência direta da forma como os parâmetros são stringificados para a construção da URL. Para evitar esse comportamento, pode-se optar por usar query ou implementar lógicas de tratamento tanto entes da navegação quanto ao receber os parâmetros.

Tags: Vue.js vue-router javascript navegacao parâmetros

Publicado em 6-7 17:14 por Thomas