【Vue入门】组件及组件化

🚀 欢迎来到我的CSDN博客:Optimistic _ chen

一名热爱技术与分享的全栈开发者,在这里记录成长,专注分享编程技术与实战经验,助力你的技术成长之路,与你共同进步!


🚀我的专栏推荐

专栏 内容特色 适合人群
🔥C语言从入门到精通 系统讲解基础语法、指针、内存管理、项目实战 零基础新手、考研党、复习
🔥Java基础语法 系统解释了基础语法、类与对象、继承 Java初学者
🔥Java核心技术 面向对象、集合框架、多线程、网络编程、新特性解析 有一定语法基础的开发者
🔥Java EE 进阶实战 Servlet、JSP、SpringBoot、MyBatis、项目案例拆解 想快速入门Java Web开发的同学
🔥Java数据结构与算法 图解数据结构、LeetCode刷题解析、大厂面试算法题 面试备战、算法爱好者、计算机专业学生
🔥Redis系列 从数据类型到核心特性解析 项目必备

🚀我的承诺:

✅ 文章配套代码:每篇技术文章都提供完整的可运行代码示例

✅ 持续更新:专栏内容定期更新,紧跟技术趋势

✅ 答疑交流:欢迎在文章评论区留言讨论,我会及时回复(支持互粉)


🚀 关注我,解锁更多技术干货!
⏳ 每天进步一点点,未来惊艳所有人!✍️ 持续更新中,记得⭐收藏关注⭐不迷路 ✨

📌 标签:#技术博客#编程学习#Java#C语言#算法#程序员

文章目录

什么是组件?

组件是一个独立的、可复用的Vue实例,也是一段独立的UI视图 ,代码写在一个独立的.vue文件包含JS + HTML + CSS三部分组成。类似于玩的拼图,一个vue文件就是拼图的一小块碎片;

组件化

组件化是一种开发思想,一个页面可以理解为是为一个个"零件"拼到一起的,每个组件都有自己独立的结构、样式、行为。通过组件的组合与拼装最后形成一个完整的页面。类似要完成整个拼图,意味着我们需要把所有碎片组合到一起。

这种思想的核心在于分解思维,通过化繁为简、化整为零来实现。其优势在于各个部分相对独立(不用担心变量名重复),便于重复使用(提高某段标签的复用性)。

比如B站的导航栏:大体可以拆分为三个组件来"拼装"

组件的使用(重点)

组件(vue文件)由三部分组成:

  • template:HTML结构
  • script:JavaScript逻辑
  • style:CSS样式(可支持scss,但是记得装包哦~)

组件使用的四大步骤:

  1. 创建组件(.vue文件)
javascript 复制代码
//行为
<script setup>
</script>

//结构
<template>
  <div>
  </div>
</template>

//样式
<style>
</style>
  1. 导入要使用的组件(包)
javascript 复制代码
import 组件对象 from '相对路径'
// eg
import MyPanel from './components/MyPanel.vue'
  1. 注册(全局注册)
    在main.js文件中全局注册:一次注册,全局使用
javascript 复制代码
// main.js - 只需写一次
import { createApp } from 'vue'
import App from './App.vue'
import MyButton from './components/MyButton.vue'
import MyInput from './components/MyInput.vue'

const app = createApp(App)

// 全局注册
app.component('MyButton', MyButton)
app.component('MyInput', MyInput)

app.mount('#app')

局部组件需要在每个使用的组件里面注册,只能在注册它的组件内使用;优势在于只有使用时才占用内存(一般不缺那点内存~)

  1. 使用组件
    把组件当作自定义标签使用(类似调用接口~)
javascript 复制代码
//双标签
<组件名></组件名>
//单标签
<组件名 />

//eg
<!-- 大驼峰 双标签 --->
<MyPanel></MyPanel>
<!-- 大驼峰 自闭和单标签 --->
<MyPanel />

<!-- 烤串法 双标签 --->
<my-panel></my-panel>
<!-- 烤串法 自闭和单标签 --->
<my-panel />

最终,自定义标签会被自身的template下的原生标签全部替换掉。

可能有点难理解: 只是一个占位符,Vue找到这个组件的定义,用组件template 里的真实HTML替换掉这个占位符,最终页面上显示的只有真实的原生标签。

这就是为什么叫组件化 --- --- 定义一次模板,可以重复使用,每次使用都会被替换成真实的HTML。

App.vue根组件

我们把App.vue做为根组件,也就是顶层组件,是组件数的起点入口。main.js是程序开始的入口(类似于main)

组件的生命周期

组件的生命周期 = 组件从出生到死亡的过程,可以分为四个核心阶段:

阶段 触发时机
创建 组件被创建时
挂载 组件渲染到页面上时
更新 数据变化导致页面更新
卸载 组件从页面上移除时

钩子函数(选项式API)

每个Vue组件实例在创建时都需要经历⼀系列的初始化步骤,在初始化过程中会自动运行的一些函数,称为Vue生命周期钩子:到某个时间点自动调用的函数。

就像闹钟,你设定早上7点响铃(定义函数),时间到了7点自动响(自动调用)

官方生命周期图示:

准备工作

javascript 复制代码
<template>
  <div>
    <h2>{{ message }}</h2>
    <button @click="message = '数据变了'">改变数据</button>
    <button @click="show = false">销毁组件</button>
  </div>
</template>


<script>
export default {
// 提供响应式数据
data() {
  return {
    count: 0
  }
},
    // 提供⽅法/函数
 
    methods: {
      fn() {
        console.log('fn 函数执⾏了')
      }
    },
    setup() {
      console.log('0-setup')
    },
    //进入第一阶段

第一阶段:创建阶段

javascript 复制代码
//创建前:此时还没有创建,无法访问data数据,也无法调用方法
  beforeCreate() {
    console.log('数据是:', this.message) // undefined
  },
//创建后:此时可以访问数据,也可以调用方法
  created() {
    console.log('数据是:', this.message) // '你好,Vue'
  },

//进入第二阶段

第二阶段:挂载阶段

javascript 复制代码
//挂载前:此时写在 template 下的标签还没有变成真实DOM,故⽽⽆法获取DOM 
 beforeMount() {
    console.log('beforeMount:没有显示到页面')
  },
// 挂载后:此时写在 template 下的标签已经变成了真实DOM,故⽽可以获取DOM(是最早可以操作DOM的时机)
  mounted() {
    console.log('mounted:已经显示到页面了')
    // 最常用的钩子,适合发请求
  },
//进入第三阶段

第三阶段:更新阶段

javascript 复制代码
//更新前:页面显示旧数据
 beforeUpdate() {
    console.log('5. beforeUpdate:数据变了,还没有更新页面')
  },
//更新后:显示新数据
  updated() {
    console.log('6. updated:页面更新完了')
  },

//进入第四阶段

第四阶段:卸载阶段

javascript 复制代码
// 卸载前:组件移除阶段
 beforeUnmount() {
    console.log('7. beforeUnmount:组件马上要销毁了')
    // 清理定时器、取消订阅
  },
//卸载后:没有组件了
  unmounted() {
    console.log('8. unmounted:组件已经销毁了')
  }
}
</script>

选项式API和组合式API

两者都是 Vue 组件的两种不同书写方式,也是从 Vue 2 过渡到 Vue 3的必会知识。

角度 选项式API 组合式API
逻辑方式 数据、方法、函数等各自逻辑分离 将一个功能相关的数据、方法、生命周期钩子写在一起
代码风格 声明式:通过this访问组件实例 函数式:基于setup语法,使用ref等响应式API
逻辑复用 依赖 mixins,但是容易导致命名冲突等问题 使用组合式函数,将逻辑抽离为独立的函数,逻辑清晰
适用场景 逻辑不复杂,结构简单 大型、复杂的组件或可复用的逻辑单元

钩子函数(组合式API)

创建阶段 挂载阶段 更新阶段 销毁阶段
Vue2(选项式) beforeCreate created beforeMount mounted beforeUpdate updated beforeUnmount unmounted
Vue3(组合式) setup(网络请求) onBeforeMount Onmounted(操作DOM) onBeforeUpdate Onupdated onBeforeUnmount onUnmounted(清理工作)
javascript 复制代码
<template>
  <div>
    <h2>{{ message }}</h2>
    <button @click="message = '数据变了'">改变数据</button>
    <button @click="show = false">销毁组件</button>
  </div>
</template>

<script setup>
import { ref, onBeforeMount, onMounted, onBeforeUpdate, onUpdated, onBeforeUnmount, onUnmounted } from 'vue'

// 1. 数据
const message = ref('你好,Vue')
const show = ref(true)

// 注意:组合式API中没有beforeCreate和created
// script setup执行时就相当于created阶段

console.log('0. setup执行:数据已经有了', message.value)

// 2. 挂载阶段
onBeforeMount(() => {
  console.log('1. onBeforeMount:马上要显示到页面了')
})

onMounted(() => {
  console.log('2. onMounted:已经显示到页面了')
  // 最常用的钩子,适合发请求
})

// 3. 更新阶段
onBeforeUpdate(() => {
  console.log('3. onBeforeUpdate:数据变了,马上更新页面')
})

onUpdated(() => {
  console.log('4. onUpdated:页面更新完了')
})

// 4. 卸载阶段
onBeforeUnmount(() => {
  console.log('5. onBeforeUnmount:组件马上要销毁了')
  // 清理定时器、取消订阅
})

onUnmounted(() => {
  console.log('6. onUnmounted:组件已经销毁了')
})
</script>

完结撒花!🎉

如果这篇博客对你有帮助,不妨点个赞支持一下吧!👍
你的鼓励是我创作的最大动力~

想获取更多干货? 欢迎关注我的专栏 → optimistic_chen

📌 收藏本文,下次需要时不迷路!

我们下期再见!💫 持续更新中......


悄悄说:点击主页有更多精彩内容哦~ 😊

相关推荐
北寻北爱2 小时前
面试题-css篇
前端
Hello_Embed2 小时前
LVGL 入门(八):标签控件 lv_label
前端·笔记·stm32·单片机·嵌入式
小江的记录本2 小时前
【AOP】AOP-面向切面编程 (系统性知识体系全解)
java·前端·后端·python·网络协议·青少年编程·代理模式
鹏多多2 小时前
Flutter使用pretty_qr_code生成高颜值二维码
android·前端·flutter
Qiuner2 小时前
浏览器拓展通用安装方法 edge浏览器、谷歌浏览器、google浏览器、火狐浏览器
前端·google·edge
..过云雨2 小时前
【负载均衡oj项目】03. compile_server编译运行服务设计
运维·c++·html·负载均衡
xiaoxue..2 小时前
前后端双令牌认证(Access Token + Refresh Token)全方案实现:安全与体验兼得
前端·后端·web安全·面试·typescript·nestjs
下雨打伞干嘛2 小时前
手写Promise
开发语言·前端·javascript
Mike_jia2 小时前
中国版的OpenClaw--OpenOcta(八爪鱼)为运维人打造的 7×24h 数字员工
前端