Vue: $ attrs é indefinido quando o componente não tem props

Criado em 1 ago. 2017  ·  8Comentários  ·  Fonte: vuejs/vue

Versão

2.4.2

Link de reprodução

https://jsfiddle.net/50wL7mdz/50757/

Passos para reproduzir

Acesse $ attrs como objeto no contexto do componente, quando nenhum adereço foi fornecido.

O que é esperado?

$ attrs é um objeto que contém adereços não reconhecidos. Portanto, eu esperaria um objeto vazio, quando nenhum adereço é especificado na tag do componente.

O que realmente está acontecendo?

$ attrs é indefinido

bug

Comentários muito úteis

Acabei de encontrar isso e foi definitivamente inesperado para mim que $attrs deveria ser undefined .

Por exemplo, se você estivesse escrevendo um aplicativo de tarefas que começa sem todos, seria muito estranho fazer a lista começar como undefined vez de [] . Você teria que adicionar if instruções (ou encadeamento opcional) em todo o seu aplicativo. Este caso é semelhante.

Para casos de nicho quando um usuário deseja verificar se existe algum $attrs , ainda seria possível usar Object.keys($attrs).length , então esse caso ainda é coberto.

A parte que realmente me convence de que este é um bug, é que $attrs _is_ é definido como um objeto vazio quando um prop é passado para um componente - como o OP aponta. Portanto, atualmente, verificar se existe algum $attrs exigiria as duas estratégias:

$attrs && Object.keys($attrs).length

Todos 8 comentários

Por curiosidade, que problema você está enfrentando por ter um $attrs indefinido? Você está acessando $attrs.something ? (se sim, por quê?)

editar: Também estou perguntando porque ter $attrs igual a undefined quando não há atributos pode ser útil

@greegus , no caso de você estar fazendo algo como if ($attrs.myProp) você pode fazer if ($attrs?.myProp) usando babel-plugin-transform-optional-chaining .

Eu julgaria esse comportamento esperado, mas é discutível.

ping @greegus

Acabei de encontrar isso e foi definitivamente inesperado para mim que $attrs deveria ser undefined .

Por exemplo, se você estivesse escrevendo um aplicativo de tarefas que começa sem todos, seria muito estranho fazer a lista começar como undefined vez de [] . Você teria que adicionar if instruções (ou encadeamento opcional) em todo o seu aplicativo. Este caso é semelhante.

Para casos de nicho quando um usuário deseja verificar se existe algum $attrs , ainda seria possível usar Object.keys($attrs).length , então esse caso ainda é coberto.

A parte que realmente me convence de que este é um bug, é que $attrs _is_ é definido como um objeto vazio quando um prop é passado para um componente - como o OP aponta. Portanto, atualmente, verificar se existe algum $attrs exigiria as duas estratégias:

$attrs && Object.keys($attrs).length

@chrisvfritz me convenceu - é um bug.

@LinusBorg Parece que ninguém está trabalhando neste bug atualmente. Posso ter um relatório para isso?

Certo!

Esta página foi útil?
0 / 5 - 0 avaliações