【问题标题】:Vuejs doesn't render components inside HTML table elementsVuejs 不会在 HTML 表格元素中呈现组件
【发布时间】:2018-11-18 11:25:11
【问题描述】:

我想渲染一个在表格中显示一行的自定义组件。

我有以下代码:

// js file
Vue.component('message-row', {
    data: function () {
        return {
            msg: 'Hello'
        }
    },
    template: '<tr><td>{{ msg }}</td></tr>'
});

new Vue({
  el: '#app'
});


// html file
<div id="app">
    <table><message-row></message-row></table>
</div>

问题是该行最终呈现在表格之外!像这样:

<div id="app">
    <tr><td>Hello</td></tr>
    <table></table>
</div>

您可以在此 JSFiddle https://jsfiddle.net/eciii/7v6yrf3x/ 中查看它

我不确定这是一个错误还是我只是在这里遗漏了一些非常明显的东西......

【问题讨论】:

  • 在 Vue 有机会更改它之前,浏览器会尝试通过将未知标签移出表格来“修复”您的 HTML。
  • @ChrisG 你知道解决方案吗?使用组件的重点是能够像这样使用它们不是吗?

标签: javascript vue.js vuejs2


【解决方案1】:

查看 Vue.js 关于DOM Template Parsing Caveats 的文档:

某些 HTML 元素,例如 &lt;ul&gt;&lt;ol&gt;&lt;table&gt;&lt;select&gt; 对其中可以出现的元素有限制,而某些元素例如 &lt;li&gt;&lt;tr&gt; 和 @987654329 @ 只能出现在某些其他元素中。

当使用具有此类限制的元素的组件时,这将导致问题。例如:

<table>
  <blog-post-row></blog-post-row>
</table>

自定义组件&lt;blog-post-row&gt; 将被吊出为无效 内容,导致最终呈现的输出出现错误。幸运的是, is 特殊属性提供了一种解决方法:

<table>
  <tr is="blog-post-row"></tr>
</table>

您需要使用is 属性添加组件,如下所示。

<table><tr is="message-row"></tr></table>

https://jsfiddle.net/7v6yrf3x/1/

【讨论】:

  • 太棒了!我只是错过了文档的那部分。
  • 回答很有帮助。谢谢!但是如何传递道具呢?
  • @M.Islam 一如既往:&lt;tr is="blog-post-row" prop1="text" :prop2="var"&gt;&lt;/tr&gt;
  • jsfiddle 链接不起作用。我应该在哪里添加 is="" ?我是在 html 文件中添加它还是在 JS 文件的组件中添加它。我是添加单独的 标签还是只添加 is=" " 到现有的 标签。谢谢
  • 我不小心弄到了: 变成了
猜你喜欢
相关资源
最近更新 更多
热门标签