Vue组件 - 在错误的位置渲染

时间:2017-09-22 23:06:52

标签: javascript vue.js vuejs2 vue-component

我发现vue组件和内联模板之间存在奇怪的行为。

示例#1:内嵌模板

这是按预期工作的。根据下面的示例#2,vue组件未更改,唯一的区别是我已将模板内容作为内联模板复制到标记中。

请参阅:https://jsfiddle.net/pobffmnv/

<div class="panel panel-primary">
    <div class="panel-heading">Current Clients</div>
    <table class="table table-hover">
        <thead>
            <tr>
                <th>Client Name</th>
                <th style="text-align: center;">No. Projects</th>
                <th style="text-align: center;">Time (7 days)</th>
                <th style="text-align: center;">Edit</th>
            </tr>
        </thead>
        <tbody>
            <clientlistitem inline-template>
                <tr>
                    <td>Test</td>
                    <td style="text-align: center;">0</td>
                    <td style="text-align: center;">0</td>
                    <td style="text-align: center;">
                        <div class="btn-group btn-group-xs" role="group">
                            <button type="button" class="btn small btn-primary">Edit</button>
                        </div>
                    </td>
                </tr>
            </clientlistitem>
        </tbody>
    </table>
</div>

这正确显示以下内容: Correct

示例#2:非内联

以下是我的Vue模板。以下是删除内联模板的代码更改。

请参阅:https://jsfiddle.net/Ld47hoy2/

<template>
    <tr>
        <td>Test</td>
        <td style="text-align: center;">0</td>
        <td style="text-align: center;">0</td>
        <td style="text-align: center;">
            <div class="btn-group btn-group-xs" role="group">
                <button type="button" class="btn small btn-primary">
                    Edit
                </button>
            </div>
        </td>
    </tr>
</template>
<script>
    export default {

    }
</script>

更新了网页代码:

<div class="panel panel-primary">
    <div class="panel-heading">Current Clients</div>
    <table class="table table-hover">
        <thead>
            <tr>
                <th>Client Name</th>
                <th style="text-align: center;">No. Projects</th>
                <th style="text-align: center;">Time (7 days)</th>
                <th style="text-align: center;">Edit</th>
            </tr>
        </thead>
        <tbody>
            <clientlistitem></clientlistitem>
        </tbody>
    </table>
</div>

但是,有了上述内容,将显示以下内容: Incorrect

查看页面输出的源代码,它似乎已将呈现的代码放在我的表格之前......?我希望它介于<tbody></tbody>标签之间..

Strange output

为什么Vue会将代码输出到该位置而不是预期的位置?

1 个答案:

答案 0 :(得分:5)

这里的问题是,in DOM templates模板首先由浏览器呈现,而HTML表只允许内部的某些元素。在这种情况下,组件clientlistitem首先在外面表中呈现,然后Vue编译模板,导致组件位于错误的位置。

要解决此问题,请使用is special attribute

<tbody>
  <tr is="clientlistitem"></tr>
</tbody>

浏览器会接受此操作并将tr呈现在正确的位置,但Vue会将其解释为您的组件。

这是你的小提琴updated