Vue 组件入门学习笔记:局部注册、全局注册与 Props 传值详解

作为 Vue 初学者,组件是绕不开的核心知识点。今天就来整理一下组件的注册方式和 ** 组件间数据传递(Props)** 的核心内容,既是自己的学习总结,也希望能帮到同样入门的小伙伴~

一、组件的局部注册:三步走实现组件复用

局部注册是指仅在当前组件内可使用 的注册方式,适合按需引入的场景。核心流程分三步:引入组件 → 注册组件 → 模板中使用

示例代码(以App.vue引入Header.vue为例)

vue

xml 复制代码
<!-- App.vue -->
<template>
  <!-- 第三步:模板中使用组件 -->
  <Header /> 
  <Main />
  <Aside />
</template>

<script>
// 第一步:引入需要注册的组件
import Header from "./pages/Header.vue"
import Main from "./pages/Main.vue"
import Aside from "./pages/Aside.vue"

export default {
  // 第二步:在components选项中注册组件
  components: {
    Header,
    Main,
    Aside
  }
}
</script>

核心逻辑 :通过import引入组件文件,在components选项中声明后,就能在当前组件的模板中以标签形式使用了。这种方式的好处是 "用多少引多少",非常灵活~

二、组件的全局注册:一次注册,全局可用

全局注册是指在项目入口文件(如main.js中注册组件,注册后所有组件都能直接使用,无需重复引入。

示例代码(在main.js中全局注册Header组件)

javascript

运行

javascript 复制代码
// main.js
import { createApp } from 'vue'
import App from './App.vue'
// 引入要全局注册的组件
import Header from "./pages/Header.vue"

const app = createApp(App)

// 全局注册:第一个参数是组件名,第二个是组件对象
app.component("Header", Header)

app.mount('#app')

优点 :全局组件在任何地方都能直接用,不用重复引入和注册。缺点

  1. 即使某个页面没用到该组件,打包时也会被包含进去,增加包体积;
  2. 大型项目中依赖关系不明确,维护起来比较麻烦。

所以,全局注册适合项目中频繁复用的 "基础组件" (如按钮、输入框),普通业务组件更推荐局部注册~

三、组件间数据传递:Props 实现父传子

Vue 中组件是独立的,想要实现 "父组件给子组件传数据",就需要用到Props 。它的核心规则是:只能父传子,传值无数量 / 类型限制,但子组件不能直接修改父传的值

1. Props 的基本使用流程(父传子)

ComponentA(父)向ComponentB(子)传值为例:

vue

xml 复制代码
<!-- ComponentA.vue(父组件) -->
<template>
  <h3>ComponentA</h3>
  <!-- 第一步:在子组件标签上绑定要传递的数据 -->
  <ComponentB :title="title" :age="age" :names="names"/>
</template>

<script>
import ComponentB from "./ComponentB.vue"
export default {
  components: { ComponentB },
  data() {
    return {
      title: "标题",
      age: 20,
      names: ["iwen", "ime"]
    }
  }
}
</script>

vue

xml 复制代码
<!-- ComponentB.vue(子组件) -->
<template>
  <p>{{ title }}</p>
  <p>{{ age }}</p>
  <p v-for="(item,index) of names" :key="index">{{ item }}</p>
</template>

<script>
export default {
  // 第二步:子组件通过props选项声明接收的数据
  props: ["title", "age", "names"]
}
</script>

2. Props 的高级配置(类型、默认值、必填项)

实际开发中,我们需要对 Props 做类型限制、默认值设置、必填校验,让组件更健壮。

vue

xml 复制代码
<!-- ComponentB.vue(子组件) -->
<script>
export default {
  props: {
    // 限制title的类型可以是字符串、数字、数组、对象
    title: {
      type: [String, Number, Array, Object],
      required: true // 表示title是必填项
    },
    // 限制age的类型是数字,默认值为0
    age: {
      type: Number,
      default: 0
    },
    // 数组/对象的默认值必须用工厂函数返回
    names: {
      type: Array,
      default() {
        return ["空"]
      }
    }
  }
}
</script>

关键注意点

  • type支持的类型有StringNumberBooleanArrayObjectDateFunctionSymbol
  • 数组 / 对象的default必须用工厂函数返回,否则会导致所有实例共享同一个默认值;
  • required: true表示该 Props 是必填项,父组件必须传递。

3. 千万注意:子组件不能直接修改 Props 的值

Vue 规定Props 是 "单向数据流" ,子组件只能读取 Props 的值,不能直接修改。如果强行修改,控制台会报错~

vue

xml 复制代码
<!-- 错误示范!子组件不能直接修改父传的props -->
<script>
export default {
  props: ["title"],
  methods: {
    updateHandle() {
      this.title = "新数据" // 报错!不允许直接修改props
    }
  }
}
</script>

如果需要修改,正确的做法是:子组件通过事件($emit)通知父组件,由父组件来修改数据。

总结:组件注册与传值核心要点

  • 组件注册:局部注册 "按需引入" 灵活,全局注册 "一次注册到处用" 但要慎用;
  • Props 传值:父传子的核心方式,支持类型限制、默认值、必填校验,且子组件不能直接修改 Props。
相关推荐
SHolmes185416 分钟前
给定某日的上班时间段,计算当日的工作时间总时长(Python)
开发语言·前端·python
掘金安东尼20 分钟前
顶层元素问题:popover vs. dialog
前端·javascript·面试
掘金安东尼25 分钟前
React 的新时代已经到来:你需要知道的一切
前端·javascript·面试
掘金安东尼27 分钟前
React 已经改变了,你的 Hooks 也应该改变
前端·vue.js·github
Codebee29 分钟前
A2UI vs OOD全栈方案:AI驱动UI的两种技术路径深度解析
前端·架构
掘金安东尼30 分钟前
TypeScript 严格性是非单调的:strict-null-checks 和 no-implicit-any 的相互影响
前端·面试
1024肥宅42 分钟前
现代 JavaScript 特性:TypeScript 深度解析与实践
前端·javascript·typescript
用户47949283569151 小时前
并发编程里的"堵车"与"红绿灯":死锁、活锁与两种锁策略(乐观锁、悲观锁)
前端·后端
一 乐1 小时前
智慧医药|基于springboot + vue智慧医药系统(源码+数据库+文档)
java·前端·数据库·vue.js·spring boot·后端
CC码码1 小时前
告别杂乱数字:用 Intl.NumberFormat 打造全球友好的前端体验
前端·javascript·面试