javascript - 如何测试具有特定名称的组件是否已在 Composition API (Vue 3) 中注册

标签 javascript vue.js vue-component vuejs3

我有一个通过名称加载动态组件的模板:

<template>
      <div>
        <div>
          <div>
            <component
              :is="getFormRenderer"
            ></component>
          </div>
        </div>
      </div>
</template>

getFormRenderer返回按名称标识组件的字符串(它来自 API)。

所有可能的子组件(在这个例子中只有 telegram_send_messagetime_time 被导入和注册:


<script>
import { useStore } from "vuex";
import { computed } from "vue";

import exampleComponentOne from "@/components/forms/exampleComponentOne.vue";
import exampleComponentTwo from "@/components/forms/exampleComponentTwo.vue";
import defaultComponentTwo from "@/components/forms/defaultComponent.vue";

export default {
  name: "ActionEditor",
  setup() {
    const store = useStore();

    const getFormRenderer = computed(() => {
      return (
        store.state.level.actionSelected.plugin
      );
    });
    return {
      getFormRenderer,
    };
  },
  components: {
    exampleComponentOne,
    exampleComponentTwo,
    defaultComponent
  },
};
</script>

现在我要修改动态<component>在某种程度上它默认为 defaultComponent.vue如果 getFormRenderer 返回一个不存在的组件名称。

但是我找不到任何方法来实现这一点。我想过使用 this.hasOwnProperty() 但在 setup() 内部,这确实是未定义的。

有没有标准的方法来做到这一点?

最佳答案

检查组件是否存在于 setup() 中的一种简单方法是使用 resolveComponent()resolveDynamicComponent() , 它按名称查找组件。请注意 resolveDynamicComponent() 的文档声明它会针对不存在的组件发出警告,但实际上是 resolveComponent() 执行此操作(自 v3.0.9)。

如果找不到组件,这两个函数都会返回给定的组件名称,因此您可以通过验证返回类型是否为字符串来确定组件是否存在:

import { computed, resolveDynamicComponent } from 'vue'

export default {
  setup() {
    const isComponent = name => typeof resolveDynamicComponent(name) !== 'string'

    const store = useStore();
    const getFormRenderer = computed(() => 
      isComponent(store.state.level.actionSelected.plugin)
        ? store.state.level.actionSelected.plugin
        : 'DefaultComponent'
    );

    return {
      getFormRenderer
    }
  },
  components: {
    //...
  },
}

demo

关于javascript - 如何测试具有特定名称的组件是否已在 Composition API (Vue 3) 中注册,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66876624/

相关文章:

JavaScript:在未定义的新 Array() 上使用 .map() 和 .forEach()

javascript - JS 中 == 和 === 的区别

apache - Vue.js + Apache ,如何编写多入口的重定向规则?

javascript - VueJS 连接不相关的(如在父/子中)组件

javascript - 类型错误 : Cannot read property 'minify' of undefined in Nuxt. js

vue.js - 类星体 : Is there any way to get the value typed into a QSelect with use-input before it gets removed on blur?

c# - 我可以使用 onBlur 事件对文本框进行日期检查吗?

javascript - Vue.js - 使用过滤器更新父数据

javascript - VueJS 路由器 : $route is not defined

javascript - 如何在 Javascript 中设置表格样式?