Vue2 组件四个"名字",我曾经傻傻分不清楚


先说我当时有多懵

我第一次看到一个 Vue 组件的使用方式时,脑袋是懵的:

import ImLayout from '@/components/.../Layout/index.vue';
components: { ImLayout }
<im-layout />
name: 'im-layout'

四个地方,都像是在说同一件事,又感觉哪里不对。

它们到底是什么关系?


直接给结论

在 Vue 2 里,组件能不能在模板里使用,关键看三件事:

 1. 组件有没有被 import 进来
 2. 有没有在 components 里注册
 3. 模板里有没有用对标签名

name,只是组件自己的**"身份名片"**,不负责让你用它。


四个"名字",分开说

第一个:import ImLayout from ...

这是 JavaScript 层面的变量名,你把一个文件"抱进来",给它取个名字方便后续引用。

// 你也可以叫它 ChatLayout,只要后面跟着改
import ChatLayout from '@/components/.../Layout/index.vue';

名字本身不固定,你起的什么,后面就叫什么。


第二个:components: { ImLayout }

这是在当前页面注册组件,相当于告诉 Vue:

完整写法等价于:

components: {
  ImLayout: ImLayout  // 键名就是你之后在模板里写的标签名
}

第三个:<im-layout />

这是在模板里真正调用组件的地方。

Vue 会自动把注册名 ImLayout 对应到 im-layout(驼峰 → 短横线),所以这两种写法都可以:

<ImLayout />
<im-layout />

项目里更常见的是带短横线的写法(kebab-case)。


第四个:name: 'im-layout'

这是组件给自己贴的名字,主要用于:

用途说明
keep-alive 缓存控制exclude/include 通过 name 识别组件
Vue Devtools 显示调试时能看到有意义的组件名,而不是一堆 <Anonymous>
递归组件组件在模板里引用自己时需要用 name

name 删掉,页面照样能正常渲染。 因为真正决定能不能用的是 components 注册。


用真实项目做个例子

假设你有一个即时聊天模块,在页面入口里这样写:

// 第一步:把文件引进来,起名叫 ImLayout
import ImLayout from '@/components/review-service/instant-messaging/Layout/index.vue';

export default {
  // 第二步:在当前页面注册这个组件
  components: { ImLayout },
};
<!-- 第三步:在模板里使用它 -->
<im-layout />

这能正常工作,是因为:

  1. import 把文件拿进来了
  2. components 把这个组件注册进了当前页面
  3. Vue 自动把 ImLayoutim-layout 对应起来

跟组件内部写没写 name: 'im-layout' 无关。


三个常见误区

误区一:文件名决定标签名

不对。index.vue 只是文件名,不能自动决定你在模板里写什么。

真正决定的是 components 注册时用的键名。


误区二:name 就是注册名

不对。name 是组件自我描述,注册是靠 components


误区三:import 名字必须和标签一致

不对。import 只是变量名,标签名取决于 components 如何注册。

只要注册正确,模板里 <ImLayout /><im-layout /> 都可以。


️ 遇到组件时,用这个顺序判断

 1. 它有没有被 import2. 它有没有写进 components?
 3. 模板里有没有用对标签名?
 4. name 只在缓存、调试、递归这几个场景才有意义

把这四步想明白,就不会再混淆了。


一句话总结

import   → 把文件拿进来(JS 变量名)
components → 注册进当前页面(决定能用什么标签)
<im-layout> → 在模板里调用组件
name     → 组件的自我描述(和能不能用无关)

这是我学习 Vue2 真实项目时的第一篇总结。学得慢没关系,搞清楚一个是一个。

下一篇:src/components 里的文件,到底从哪里被调用?

本站提供的所有下载资源均来自互联网,仅提供学习交流使用,版权归原作者所有。如需商业使用,请联系原作者获得授权。 如您发现有涉嫌侵权的内容,请联系我们 邮箱:alixiixcom@163.com