Vue.js 组件删除同级标记。特征?

Vue.js component removing sibling markup. Feature?

在学习 Vue 的过程中,我想知道我遇到的一些行为。我有我的主要标记,并找到了一个将标记的一部分变成组件的用例。但是,当我将组件与其余标记(不是组件)一起添加到容器时,该标记将被删除,仅保留组件标记。这是一项功能吗?

<div id="container">
  <Component />
  
  <div class="some-html">
    ...
  </div>
</div>

安装应用程序后,<div class="some-html"> 将被删除。在我的例子中,这个标记最终将成为一个组件,但对于原型设计,我希望我可以将组件与非组件混合在一起。我目前的解决方法是将组件包装在 <div>.

编辑 此实例通过 webpack 使用单个文件组件 运行。使用答案中的建议,我在组件上使用自关闭标签时删除了挂载功能。这是标记的样子(徽章是组件的名称):

<div class="row"> 是组件的兄弟:

tl:博士

使用 in-DOM 模板时,不要使用自闭合标签。而不是 <component /> 使用 <component></component>

说明

这只是一种预感,但根据给出的线索,我会说您正在使用 in-DOM 模板。您直接在 index.html 中编写模板 - Vue 将您放置在要安装到的元素中的所有内容用作模板 - 在本例中为 #container

in-DOM 模板的问题是浏览器在执行任何 JavaScript 之前解析 HTML 并强制执行 HTML 规范定义的任何规则。

其中一些在 Vue 文档中有解释 - DOM Template Parsing Caveats

那里没有解释但恕我直言导致问题的描述是,在 HTML5 规范中,仅允许在“空”元素上使用自闭合标签(空元素是那些可能永远不包含任何内容的元素 -如 br、img 等)-参见这个 SO 问题-Are (non-void) self-closing tags valid in HTML5?

结果是你的模板是这样呈现给 Vue 的:

<div id="container">
  <component>
    <div class="some-html">
      ...
    </div>
  </component>
</div>

您可以通过注释掉 $mount('#container') 调用、在浏览器中加载页面并检查页面来轻松检查...

并且因为您的 Component 不使用 default slot,所以 <component> 中的所有内容根本不会呈现...