【问题标题】:Dynamically pass component markup to Vue instance动态地将组件标记传递给 Vue 实例
【发布时间】:2020-08-04 02:56:41
【问题描述】:

我目前正在构建一些软件,它允许用户将 HTML sn-p 放入网页中,我的 VueJS 堆栈将动态呈现博客文章。

我正在尝试找到一种方法,将组件标记动态呈现到给定的 <div> 中,而无需在该 <div> 中声明 Vue 组件标记 - 以避免客户混淆。

这是一个工作代码示例:

<div id="live-blogs" v-cloak>
    <live-blog
        v-for="blog in blogs"
        :key="blog.id"
        :title="blog.title"
    ></live-blog>
</div>
Vue.component('live-blog', {
    props: ['id', 'title'],
    template: '<div class="lb-entry">{{ title }}</div>',
});

const liveBlogs = new Vue({
    el: '#live-blogs',
    data: {
        blogs: [],
    },
    methods: {
        getLiveBlogs: function() {
            request.get('/read/' + id)
                .then(function (response) {
                    liveBlogs.blogs = response.data.data;
                })
        }
    },
    mounted() {
        this.getLiveBlogs();
    }
});

我想做的事

我希望能够去除组件标记,这样我的客户只需复制并粘贴以下代码。我可能会添加更多组件和功能,并且不希望这个嵌入变得越来越大。

一旦检测到目标&lt;div&gt;,javascript应该处理组件数据的动态注册和渲染。

<div id="live-blogs"></div>
<script type="text/javascript" src="/path/to/file/app.js"></script>

到目前为止我所尝试的

我尝试通过this.$el.innerHTML = componentMarkup 传递组件标记,但没有成功。

这可能使用 VueJS 吗?

【问题讨论】:

    标签: javascript html vue.js


    【解决方案1】:

    您需要做的就是将模板从 DOM 移动到主组件中作为字符串模板。只要页面某处有&lt;div id="live-blogs"&gt;&lt;/div&gt;,它就可以工作。

    Vue.component('live-blog', {
      props: ['id', 'title'],
      template: '<div class="lb-entry">{{ title }}</div>',
    });
    
    new Vue({
      el: '#live-blogs',
      template: `
    <div>
      <live-blog
        v-for="blog in blogs"
        :key="blog.id"
        :title="blog.title"
      />
    </div>`,
      data() {
        return {
          blogs: [],
        };
      },
      methods: {
        getLiveBlogs() {
          request.get('/read/' + id)
            .then(response => {
              this.blogs = response.data.data;
            });
        },
      },
      mounted() {
        this.getLiveBlogs();
      },
    });
    

    【讨论】:

    • 吟游诗人会为你写歌。非常感谢!
    猜你喜欢
    • 2019-01-03
    • 2021-04-03
    • 2020-07-22
    • 2019-01-21
    • 2019-03-28
    • 2016-10-22
    • 2019-12-10
    • 2018-05-28
    相关资源
    最近更新 更多