从自定义表格槽中删除了 THEAD、TBODY、TR HTML 元素

Posted

技术标签:

【中文标题】从自定义表格槽中删除了 THEAD、TBODY、TR HTML 元素【英文标题】:Stripped out THEAD, TBODY, TR HTML elements from a Custom Table slot 【发布时间】:2018-12-09 04:40:26 【问题描述】:

我正在尝试学习 VueJS。我还处于初级水平,所以请原谅任何误解。

我有一个.vue 文件,它呈现一个自定义表格元素。

<template>
    <table v-bind:class="classes">
        <slot></slot>
    </table>
</template>

<script>
    export default 
        data() 
            return 
                styles: 
                    separator: 'separator',
                    solid: 'bg',
                    bg: 'bg'
                
            ;
        ,
        props: 
            type:  default: 'separator' ,
            theme:  default: 'primary' 
        ,
        computed: 
            classes: function () 
                return `table m-table m-table--head-$this.styles[this.type]-$this.theme`;
            
        
    
</script>

在我试图创建模板的 html 文件中,它看起来像这样:

<custom-table type="solid" theme="primary">
    <thead>
        <tr>
            <th>Column 1</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>Value 1</td>
        </tr>
    </tbody>
</custom-table>

但是当页面渲染时,&lt;slot&gt;中的所有html都被剥离掉了,只剩下文字了:

如果我调用$vm0.$slots.defaults[0].elm,我得到的只是text,没有HTML,没有&lt;thead&gt; 等等。

我在网上搜索了vuejs2 stripping out html from slots,但找不到任何与为什么发生这种情况有关的信息。

我知道我的.vue 文件目前可能并不完美,我只是想了解一些基础知识。

感谢任何帮助,指出我为什么要剥离 HTML(或其他可能的内容)的正确方向。

【问题讨论】:

在这里推测,但您可能会遇到 &lt;thead&gt;&lt;tbody&gt; 元素作为无效内容被吊出,因为期望它们是包装它们的 &lt;table&gt;。请参阅DOM Parsing Caveats 上的此部分。 好声音,我会试试它的建议 :) 谢谢! @DigitalDrifter 答案已经发布,但您提供的链接也是一个有用的答案。如果您想将其发布为答案,我会很高兴地支持它:) 别担心,很高兴你把它整理好了。 【参考方案1】:

这是由于 HTML 中的限制:子表(如 &lt;thead&gt;&lt;tr&gt; 等)只能出现在 &lt;table&gt; 中,即使对于自定义元素也是如此。

使用自定义表格的官方解决方法是使用HTML属性is,Vue支持:

<table is="custom-table" type="solid" theme="primary">
    <thead>
        <tr>
            <th>Column 1</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>Value 1</td>
        </tr>
    </tbody>
</table>

见vue.js: what's the difference between <component :is="comp-name"/> and <div :is="comp-name"/>?

【讨论】:

这就是我们现在正在做的而不是标记重复项吗? @Derek:不一定。如果我只是添加指向具有类似内容的答案的链接,我理解您的困惑。在这种情况下,我认为虽然该答案也与该问题相关,但这些问题并不相同。我无法通过快速搜索找到合适的等效问题,尽管这是一个众所周知的警告(如果您有的话,我很乐意找到一个?)。此外,据观察,在前端许多人(希望这里不是 OP)拒绝不完全符合他们情况的重复问题。我记得 Meta 上有一篇关于它的帖子,但找不到。 很公平,只是检查一下。感谢您的解释。有些元数据有时会自相矛盾。

以上是关于从自定义表格槽中删除了 THEAD、TBODY、TR HTML 元素的主要内容,如果未能解决你的问题,请参考以下文章

学习进度

如何在表格的 tbody/thead 部分周围创建边框?

table 中 thead tbody tfoot 加载顺序问题

tbody是啥意思

我在html表格里使用thead和tbody标签,但不使用tfoot标签,会有影响吗?

仅删除 tbody 上的 tr