javascript - 如何以编程方式间接创建 Vue 组件

标签 javascript vue.js

我正在尝试以编程方式将组件添加到我的 Vue 单文件组件中的页面,如果您提前知道自己想做什么,它会很好地工作。在我的例子中,组件及其布局将通过 JSON 接收,我正在尝试动态创建它们。下面你可以看到我想做类似 eval 的事情,但不幸的是,这不适用于未实例化的对象。下面的代码使用硬编码值进行了简化,以表达观点。

<template>
  <div id="app">
    <h2>Static template:</h2>
    <InputTemplate type="text"></InputTemplate>
    <h2>Dynamically inserted:</h2>
    <div ref="container">
      <button @click="onClick">Click to insert</button>
      <br/>
    </div>
  </div>
</template>  

<script>
import Vue from 'vue'
//the component I'd like to create
import InputTemplate from './components/InputTemplate.vue'

export default {
  name: 'app',
  components: { InputTemplate },
  methods: {
    onClick() {
      //I'd like to do something like this, but eval doesn't work like this
      var ComponentClass = Vue.extend(eval('InputTemplate'))
      var instance = new ComponentClass({
        propsData: {type: 'text' }
      })
      instance.$mount()
      this.$refs.container.appendChild(instance.$el)
    }
  }
}
</script>

我在下面组合了一个辅助函数来代替 eval 并且可以工作,但感觉这个解决方案有点不雅观。对于添加的每个新组件,它还需要大量维护。有更好的方法吗?

returnComponent(componentString){
      if(componentString === 'InputTemplate'){
        return InputTemplate;
      }
    }

最佳答案

原来Vue有<component :is="yourComponentType">如果你把它扔进 v-for 中,这正是我希望完成的环形。 Documents here.

关于javascript - 如何以编程方式间接创建 Vue 组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48856616/

相关文章:

html - 我正在使用自定义构建侧边栏组件,但不确定如何添加数据

javascript - nuxt vue router afterEach 守卫

javascript - 将java日期转换为 Angular 日期

javascript - 在 Internet Explorer 中加载页面时使用 JavaScript 或 jQuery 以编程方式触发按钮单击事件

javascript - 使用 angularJS 单击 Internet Explorer 中的输入表单功能

javascript - Google Ajax 搜索 API 没有来自网站 :mywebsite. com 的结果

vue.js - 如何在 Vue Composition API 中使用 ref 验证表单

javascript - 如何修改vue.js 1.0的demo以适用于vue.js 2.0?

javascript - JavaScript 中的双重命名?

javascript - 一行 if else 语句中有什么问题