【问题标题】:What are all the properties available on a Component object in Svelte?Svelte 中 Component 对象的所有可用属性是什么?
【发布时间】:2021-04-07 20:33:58
【问题描述】:

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()ing,并且在生产中更改了组件的名称。我希望记录所有属性,看看是否有一个介于开发和生产模式之间的属性。

【问题讨论】:

  • Object.keys(ItemPanel).
  • 是的!试过了,返回[]。

标签: javascript svelte svelte-component


【解决方案1】:

我认为这不是 Svelte 特有的问题,当然我可能会弄错。

回答您实际询问的内容,您可以通过Object.getOwnPropertyNames(对于具有字符串名称的对象)和Object.getOwnPropertySymbols(对于具有符号名称的对象)获取对象(包括函数对象)的属性。 (相比之下,Object.keys 只为您提供getOwnPropertyNames 为您提供的一个子集:带有字符串名称的自己的可枚举 属性的名称。[getOwnPropertyNames 包括不可枚举的属性。])获取继承的属性,使用Object.getPrototypeOf,然后再次使用前两个函数。冲洗,重复直到到达Object.prototype

但要满足您的基本要求:

ItemPanel 在您的代码中是一个构造函数。函数通过它们的定义方式获得它们的名称。通过命名class 声明或表达式(您的看起来像声明)创建的构造函数的名称来自为class 指定的名称。函数的name 属性给出了函数的名称。

如果您以某种方式缩小代码,使得 name 不再是您要查找的内容,并且您需要一些类似的唯一标识符,您可以使用 static field 添加一个:

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

当然,这意味着重复自己。

但退一步:

我在接收要打开的组件的模态组件中使用面板的名称...

在那种情况下,我会使用实际的函数而不是它的名称。

【讨论】:

  • 非常感谢您的解释!我会闲逛看看是否有任何 Svelte Guys 知道任何事情,但这确实向我展示了我需要的道具,遗憾的是没有人可以提供帮助。我们没有像您在static id 分配中示例那样定义类,所以我要做的(现在我可以证明它是合理的)只是在我构建模式时传递组件的名称本身。谢谢!
猜你喜欢
  • 2015-07-14
  • 1970-01-01
  • 2019-09-05
  • 1970-01-01
  • 2016-10-27
  • 2012-01-12
  • 1970-01-01
  • 2019-09-06
  • 2015-01-18
相关资源
最近更新 更多