Vue: $ attrs не определен, если компонент не имеет реквизита

Созданный на 1 авг. 2017  ·  8Комментарии  ·  Источник: vuejs/vue

Версия

2.4.2

Ссылка для воспроизведения

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

Действия по воспроизведению

Доступ к $ attrs как к объекту в контексте компонента, когда не были предоставлены реквизиты.

Что ожидается?

$ attrs - это объект, содержащий нераспознанные реквизиты. Поэтому я ожидал бы пустой объект, если в теге компонента не указаны реквизиты.

Что на самом деле происходит?

$ attrs не определен

Самый полезный комментарий

Просто столкнулся с этим, и для меня было определенно неожиданно, что $attrs когда-либо должно быть undefined .

Например, если вы пишете приложение для задач, которое начинается без задач, было бы очень странно начинать список с undefined вместо [] . Вам нужно будет добавить операторы if (или необязательную цепочку) по всему вашему приложению. Этот случай похож.

Для нишевых случаев, когда пользователь хочет проверить, существуют ли какие-либо $attrs , по-прежнему можно использовать Object.keys($attrs).length , так что этот случай все еще рассматривается.

Часть, которая действительно убеждает меня, что это ошибка, заключается в том, что $attrs _is_ устанавливается в пустой объект, когда свойство $attrs потребуются обе стратегии:

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

Все 8 Комментарий

Из любопытства, с какой проблемой вы сталкиваетесь, имея неопределенный $attrs ? Вы получаете доступ к $attrs.something ? (если да, то почему?)

edit: я также спрашиваю, потому что наличие $attrs равное undefined, когда нет атрибутов, действительно может быть полезно

@greegus , если вы делаете что-то вроде if ($attrs.myProp) вы можете сделать if ($attrs?.myProp) , используя babel-plugin-transform-optional-chaining .

Я бы судить, что это ожидаемое поведение, но это спорно.

пинг @greegus

Просто столкнулся с этим, и для меня было определенно неожиданно, что $attrs когда-либо должно быть undefined .

Например, если вы пишете приложение для задач, которое начинается без задач, было бы очень странно начинать список с undefined вместо [] . Вам нужно будет добавить операторы if (или необязательную цепочку) по всему вашему приложению. Этот случай похож.

Для нишевых случаев, когда пользователь хочет проверить, существуют ли какие-либо $attrs , по-прежнему можно использовать Object.keys($attrs).length , так что этот случай все еще рассматривается.

Часть, которая действительно убеждает меня, что это ошибка, заключается в том, что $attrs _is_ устанавливается в пустой объект, когда свойство $attrs потребуются обе стратегии:

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

@chrisvfritz меня убедил - это баг.

@LinusBorg Похоже, что сейчас над этой ошибкой никто не работает. Могу я получить за это пиар?

Конечно!

Была ли эта страница полезной?
0 / 5 - 0 рейтинги