【问题标题】:Vue.js - component inside componentVue.js - 组件内的组件
【发布时间】:2016-08-25 10:57:49
【问题描述】:

我确实有一个名为 Grid 的组件。在这个组件中,我从服务器加载 JSON 数据并渲染它们。它们主要是字符串和整数。有时 JSON 包含像 <strong>myvalue</stong> 这样的 HTML,所以我用三个括号 {{{}}} 呈现数据。

问题是当 HTML 不是纯 HTML 而是像 <my-component my-param="1"></my-component> 这样的组件时。如何告诉 Vue.js 渲染这个组件?我得到的只是纯粹打印到网格中的 HTML。

谢谢

【问题讨论】:

标签: javascript vue.js


【解决方案1】:

您需要再次编译从远程加载的那段代码。

ps:我将使用 jQuery 来操作 DOM。

在这个组件中,我从服务器加载 JSON 数据并渲染它们。

我假设您有一个名为“loadAndRenderFromServer()”的函数,请修改下面的代码以适合您。

例如:如果您的网格有标记<div id='grid'>

// vuecomponent.js
export default {
    [...]

    methods: {
        loadAndRenderFromServer() {
            // first, load remote content and insert into #grid

            // now, compile
            this.$compile($("#grid").get(0));
        }
    },

    [...]
}

如果您的组件开始复制加载的内容,您可能需要使用“反编译”。查看 VueJS 文档中的 compiledecompile 方法。

【讨论】:

  • “我将使用 jQuery 来操作 DOM”似乎错过了 Vue 的重点。
  • 非常亲密的人。我的 JSON 数据上确实有 v-for。它是带有数据集的数组。每个数据集代表表格行。所以我只是这样做了 this.data = response.data 就是这样。如果我之后调用编译,它会工作吗?
  • @ceejayoz,对不起,你错了。你也可以使用 vue 对 DOM 进行简单的操作,但是在 vue 中一起使用 jQuery 或其他库并没有错。
  • @grafa, compile 将通过你的组件再次渲染 html 代码。正如我提到的,您可以为所有行调用一次编译,或者您可以为每一行运行它。但是,为每一行运行将是巨大的,并且会超载处理。如果可能的话,我建议调用一次。不要忘记检查文档,我还不是专家。 xD
  • @RicardoVigatti 在很多情况下,你可以并不意味着你应该这样做。我看到有人在做 $(this.$els.whatever).text('foobar'); 这样的事情,这浪费了 Vue 的反应性和模板系统。
【解决方案2】:

如果是组件,使用v-html(相当于{{{}}})将不会渲染其中的内容。

尝试在您的父模板中使用<slot>

否则,如果您想要动态组件,则需要使用<component>,如果您想要动态组件中的内容,则需要使用<slot>s。

我建议你使用类似的东西

<component :is="myComponent" />

并在这些组件的模型中放置一些&lt;slot&gt;s 以插入任意内容。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2018-09-27
  • 1970-01-01
  • 2018-04-18
  • 2018-10-29
  • 2021-05-16
  • 1970-01-01
  • 2018-04-17
  • 2017-07-27
相关资源
最近更新 更多