返回

解决Vue编译错误: Element is missing end tag

vue.js

解决 Vue.js 中的 "Element is missing end tag" 编译错误

使用 Vue.js 开发前端应用时,有时会遇到编译错误 "VueCompilerError: Element is missing end tag"。这种错误很恼人,明明标签都写完整了,还是报这个错。怎么回事呢?别急,下面咱们就来理一理。

一、问题根源:哪些情况会导致 “Element is missing end tag”

该错误信息直接表明,Vue 模板编译器在解析模板时,识别出某个 HTML 元素缺少闭合标签。看似简单,但情况不一,根源不同。以下列出导致该问题的情况。

  1. 真正的标签未闭合 : 在模板的 .vue 文件中,直接编写 HTML 时漏写了结束标签。检查 .vue 文件,排查问题。

  2. 特殊 HTML 实体使用错误 : 在 Vue 的模板中,对一些特殊的 HTML 实体(例如,  < 等)使用不当。这样会被解析出错误的 HTML 结构。

  3. 自定义组件问题 : 在调用 Vue 的自定义组件时,可能因为某种疏漏而没有正确的以成对形式使用标签。导致模板解析不正常。

  4. 组件注册错误 : 在使用组件时, 组件没有注册,没有正确注册,或是注册名称与使用名称不一致, 这三个注册问题, 会被当做 HTML 标签处理, 又因为没有匹配闭合标签, 所以就出这个报错。

  5. v-for循环导致的问题 : v-for 使用 <template>,如果使用不规范,则可能导致这个错误,需要查看是否有语法错误。

  6. Vue 版本与语法冲突 :低版本的 Vue 解析器可能与新版语法存在兼容性问题, 这种情况下更新最新稳定版的 Vue, 使用更新版本的语法, 或用低版本的旧语法,三种办法均可。

二、排查和解决方法

发现 “Element is missing end tag”错误时,依照下列步骤处理,问题可迎刃而解。

1. 仔细检查并补全标签

直接上手,这是最基本的操作!打开出现编译错误的 .vue 文件, 找出问题代码,直接把标签补齐。

错误代码示例

<template>
  <div>
    <p>这里缺少一个 div 闭合标签
  
</template>

修复后的代码:

<template>
  <div>
    <p>这里缺少一个 div 闭合标签</p>
  </div>
</template>

操作步骤:

  • 根据错误提示,定位到出问题的 .vue 文件和相应的代码行。
  • 审查有问题的 HTML 结构,保证所有的开始标签都对应正确配对的结束标签。
  • 保存,然后重新编译。

2. 正确处理 HTML 实体

HTML 实体在 Vue 模板里,务必谨慎处理,必须转义为文本, 否则可能干扰正常结构的解析, 有可能报错,有的时候它可能隐藏很深,发现这种结构时请逐一核对排查!。

错误代码示例

<template>
  <div>
    <p>This is an example &nbsp; </p>
  </div>
</template>

修复后的代码:

<template>
  <div>
    <p>This is an example &amp;nbsp; </p>
  </div>
</template>

操作步骤:

  • 审查有问题的模板,确定 HTML 实体的使用场景。
  • 替换成 &amp;nbsp 或对应的其他形式, 这取决于您的需求。
  • 检查替换,重新编译,问题应该得到解决。

3. 自定义组件的检查和修正

项目中如果有自定义组件,请逐个检查调用情况,规范书写,确保没有书写不全等不规范使用方式。确保组件在使用时, 成对使用开始与闭合标签!避免只写了开始标签,却没有结束标签这种尴尬。

错误代码示例

<template>
  <div>
    <my-component> 内容没有使用闭合标签
  </div>
</template>

<script>
import myComponent from './myComponent.vue'
export default {
  components:{
    myComponent
  }
}
</script>

修复后的代码:

<template>
  <div>
    <my-component>内容现在用闭合标签了</my-component>
  </div>
</template>

<script>
import myComponent from './myComponent.vue'
export default {
  components:{
    myComponent
  }
}
</script>

操作步骤:

  • 审查调用自定义组件的所有部分。
  • 补全自定义组件的结束标签, 有的是使用自定义组件, 开始与结束组件名不一致。
  • 确认引入, 确认导出组件名拼写一致。

4. 组件注册问题

检查组件是否注册,排查时应使用控制台查看具体提示信息,重点检查三处。没有注册进行注册。已经注册查看注册名称与使用名称。

错误示例

<template>
    <mycomponent></mycomponent>
</template>
<script>
import mycomponent from './mycomponent.vue';

export default {
  name: 'App',
  
};
</script>

这段代码错误非常明显,在模板中使用了 <mycomponent>,但 components 中却没有注册它。

正确的示例

<template>
    <mycomponent></mycomponent>
</template>
<script>
import mycomponent from './mycomponent.vue';

export default {
  name: 'App',
  components:{
    mycomponent
  }
  
};
</script>

components 里注册了组件。这样就可以正常解析了。

步骤

  • 查看组件的注册名和使用的名字,查看 console 中的提示信息,逐一进行修正!
  • 全局注册是否正确,是否按需引入组件
  • 没有进行注册就添加,注册了就修改成正确的

5. v-for 使用注意项

重点检查 v-for 循环中 <template>,这里面是否有不正确的语法,确保内部的标签都是正常闭合。key 是必不可少的一个步骤,防止错误!key 是不重复的字符数字等内容, 绝不能省略不写。
代码是否过于复杂?尝试重构为多个组件。

错误代码示例:

<template>
  <ul>
    <template v-for="(item, index) in items">
      <li>{{ item }}</li 
    </template>
  </ul>
</template>
<script>
export default {
  data(){
    return {
      items:['apple', 'banana', 'orange']
    }
  }
}
</script>

在这段代码里, <template> 用于 v-for 循环。但每个 <li> 缺少对应的闭合标签。在 HTML 里这是错的。

正确代码示例:

<template>
  <ul>
    <li v-for="(item, index) in items" :key="index">
      {{ item }}
    </li>
  </ul>
</template>
<script>
export default {
  data(){
    return {
      items:['apple', 'banana', 'orange']
    }
  }
}
</script>

在这个修改后的代码里, 不再使用 <template>。而是直接在 <li> 上使用 v-for 指令。每个 <li> 都有对应的闭合标签, 这就是正确的了。同时也避免了其他一些情况造成的困扰。使用了 key, 这样能得到更好的体验!

步骤

  • 排查使用了循环的地方,逐个修改代码结构
  • 使用 :key="index"

6. 处理 Vue 版本和语法的兼容问题

项目所用 Vue 库, 和开发者使用的 Vue 语法之间是否兼容。Vue 的每个大版本更新时, 会添加新语法, 移除一些旧语法, 新语法使用有问题,就试试降级,旧语法被移除用新的, 具体方法视需求而定,不一而足。当然如果使用的旧版本的 Vue, 最好的办法是升级, 因为最新版本中通常有一些安全更新,还有更好的用户体验和使用方式, 以及一些错误修复。更新到最新版本的 vuejs!这样就能使用最新的语法了,也避免兼容性带来问题,省心。

安全建议: 更新是好的,一定要慎重。大版本更新需谨慎处理。要对新语法做全面的测试,以免埋坑!建议在更新前充分了解, 全面审查, 做代码备份等操作。

这些就是解决 "Element is missing end tag" 错误的大方向。只要按这个路子排查,大概率能找到病灶。说白了,开发还是要仔细!疏忽造成的, 对比工具逐个排查下代码拼写等就能找到答案。平时多留心代码细节,省事, 高效。祝君在 Vue 开发中越来越顺!