Какие все свойства доступны для объекта компонента в Svelte?

#javascript #svelte #svelte-component

#javascript #svelte #svelte-component

Вопрос:

import ItemPanel from '../Panel/ItemPanel.svelte';

Если я войду console.log(ItemPanel) в систему, я получу определение класса:

 class ItemPanel extends SvelteComponentDev {
        constructor(options) {
            super(options);

            init(
                this,
                options
...
 

Но если я console.log(ItemPanel.name) , я просто "ItemPanel" вернусь ко мне.

Я использую имя панели в модальном компоненте, который получает компоненты для открытия, и именно так я идентифицировал их для специальной функциональности. Но потом я понял, что теряю эту функциональность при производственной сборке, потому что я tensor() редактирую, и это изменяет имя компонента в рабочей среде. Я надеюсь зарегистрировать все свойства, чтобы узнать, есть ли тот, который находится между режимом разработки и режимом производства.

Комментарии:

1. Object.keys(ItemPanel) .

2. Да! Попробовал это, вернул [] .

Ответ №1:

Я не думаю, что это вопрос, специфичный для Svelte, хотя, конечно, я могу ошибаться.

Отвечая на то, что вы на самом деле спросили, вы можете получить свойства объекта (включая объект функции) через Object.getOwnPropertyNames (для объектов со строковыми именами) и Object.getOwnPropertySymbols (для объектов с именами символов). (Напротив, Object.keys дает вам только подмножество того, что getOwnPropertyNames дает вам: имена собственных перечислимых свойств со строковыми именами. [ getOwnPropertyNames включает неисчислимые.]) Чтобы получить унаследованные свойства, используйте Object.getPrototypeOf , а затем снова используйте первые две функции. Промывайте, повторяйте, пока не достигнете Object.prototype .

Но переходим к вашему базовому требованию:

ItemPanel в вашем коде есть функция конструктора. Функции получают свои имена в соответствии с тем, как они определены. Функция-конструктор, созданная с помощью именованного class объявления или выражения (ваше выглядит как объявление), получает свое имя от имени, заданного для class . name Свойство функции дает имя функции.

Если вы каким-то образом сокращаете код, который name больше не является тем, что вы ищете, и вам нужен какой-то аналогичный уникальный идентификатор, вы можете добавить его с помощью static поля:

 class ItemPanel extends SvelteComponentDev {
    static id = "ItemPanel";
    // ...
}
 

Конечно, это означает повторение.

Но отступив на шаг назад:

Я использую имя панели в модальном компоненте, который получает компоненты для открытия…

В этой ситуации я бы использовал фактическую функцию, а не ее имя.

Комментарии:

1. Большое вам спасибо за это объяснение! Я подожду, чтобы узнать, знают ли какие-нибудь стройные ребята что-нибудь, но на самом деле это показало мне необходимые мне реквизиты, и, к сожалению, ни один из них не может помочь. Мы не определяем классы, как вы показали в примере с static id присваиванием, поэтому то, что я сделаю (теперь, когда я могу это оправдать), это просто передам имя самого компонента при создании модального. Спасибо!