Vue: $ attrs n'est pas défini lorsque le composant n'a pas d'accessoires

Créé le 1 août 2017  ·  8Commentaires  ·  Source: vuejs/vue

Version

2.4.2

Lien de reproduction

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

Étapes à suivre pour reproduire

Accédez à $ attrs en tant qu'objet dans le contexte du composant, lorsqu'aucun accessoire n'a été fourni.

Qu'attend-on?

$ attrs est un objet contenant des accessoires non reconnus. Par conséquent, je m'attendrais à un objet vide, lorsqu'aucun accessoire n'est spécifié sur l'étiquette de composant.

Que se passe-t-il réellement?

$ attrs n'est pas défini

bug

Commentaire le plus utile

Je viens de tomber sur ça et c'était vraiment inattendu pour moi que $attrs devrait jamais être undefined .

Par exemple, si vous écrivez une application todo qui commence sans todos, il serait très étrange de faire commencer la liste par undefined au lieu de [] . Vous devrez ajouter des relevés if (ou un chaînage facultatif) partout dans votre application. Ce cas est similaire.

Pour les cas de niche où un utilisateur veut vérifier s'il existe des $attrs , il serait toujours possible d'utiliser Object.keys($attrs).length , donc ce cas est toujours couvert.

La partie qui me convainc vraiment que c'est un bogue, c'est que $attrs _est_ défini sur un objet vide lorsqu'un accessoire est passé à un composant - comme le souligne l'OP. Donc actuellement, vraiment vérifier si un $attrs existe exigerait les deux stratégies:

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

Tous les 8 commentaires

Par curiosité, quel problème rencontrez-vous en ayant un $attrs non défini? Accédez-vous à $attrs.something ? (si oui, pourquoi?)

edit: Je demande aussi parce qu'avoir $attrs égal non défini quand il n'y a pas d'attrs peut en fait être utile

@greegus , au cas où vous if ($attrs.myProp) vous pouvez faire if ($attrs?.myProp) en utilisant babel-plugin-transform-optional-chaining .

Je jugerais que c'est un comportement attendu, mais c'est discutable.

ping @greegus

Je viens de tomber sur ça et c'était vraiment inattendu pour moi que $attrs devrait jamais être undefined .

Par exemple, si vous écrivez une application todo qui commence sans todos, il serait très étrange de faire commencer la liste par undefined au lieu de [] . Vous devrez ajouter des relevés if (ou un chaînage facultatif) partout dans votre application. Ce cas est similaire.

Pour les cas de niche où un utilisateur veut vérifier s'il existe des $attrs , il serait toujours possible d'utiliser Object.keys($attrs).length , donc ce cas est toujours couvert.

La partie qui me convainc vraiment que c'est un bogue, c'est que $attrs _est_ défini sur un objet vide lorsqu'un accessoire est passé à un composant - comme le souligne l'OP. Donc actuellement, vraiment vérifier si un $attrs existe exigerait les deux stratégies:

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

@chrisvfritz m'a convaincu - c'est un bug.

@LinusBorg On dirait que personne ne travaille actuellement sur ce bogue. Puis-je avoir un pr pour ça?

Sûr!

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

franciscolourenco picture franciscolourenco  ·  3Commentaires

6pm picture 6pm  ·  3Commentaires

gkiely picture gkiely  ·  3Commentaires

paulpflug picture paulpflug  ·  3Commentaires

aviggngyv picture aviggngyv  ·  3Commentaires