news 2026/6/19 18:35:37

VUE3 学习笔记(一)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
VUE3 学习笔记(一)

目录

一、VUE2与VUE3的核心区别

1.全局状态管理

2.指令

a). v-model

3.组件引用

4.API调用方式

二、VUE3

1.全局状态管理

2.指令

a). v-model

3.父子组件传值

a).defineProps父传子(参数)

b).defineEmits子传父(事件)

4.ref、reactive、watch

ref作用

reactive作用

watch作用

5.API

a).h()渲染函数


一、VUE2与VUE3的核心区别

1.全局状态管理

  • state:全局变量(数据)

  • actions:全局方法(函数)→全局方法就写这里Pinia

  • getters:全局计算属性

特性Vue2 Vue.prototypePinia actions
全局调用this.$xxxstore.xxx()
响应式需手动赋值 + nextTick自动响应,一改全更新
维护性分散、混乱集中在 store,清晰
异步麻烦原生支持 async/await

2.指令

a). v-model

Vue 2 vs Vue 3 的区别

特性Vue 2Vue 3
默认 prop 名valuemodelValue
默认事件名input/changeupdate:modelValue
多个 v-model❌ 不支持✅ 支持
自定义修饰符⚠️ 有限支持✅ 完整支持

3.组件引用

注册方式Vue2 (选项式)Vue3 (组合式 / <script setup>)
全局注册Vue.component()app.component()
局部注册components: { 子组件 }无需注册,直接导入即用
自动导入需插件 / 手动支持unplugin-auto-import自动导入组件
入口文件main.js 用new Vue()main.js 用createApp()
单文件组件必须写components选项直接导入就可以用,最简洁

4.API调用方式

  • 选项式 API(Vue2 默认):按功能类型拆分代码(data、methods、computed...)

  • 组合式 API(Vue3 默认):按业务逻辑拆分代码(把相关的变量、方法放一起)

选项式 API(VUE2)组合式 API(VUE3<script setup>)
上手难度简单,适合新手稍难,但更强大
代码结构分散,逻辑跳来跳去聚合,清晰整洁
复用逻辑mixin(有缺陷)自定义 hook(优秀)
大型项目维护困难维护轻松
TS 支持极好
代码体积较大更小,利于 TreeShaking

二、VUE3

1.全局状态管理

在 Pinia 里,全局方法就是写在actions里的函数,所有组件都能调用,而且可以改 state、可以异步、可以互相调用Pinia,相比vue2更加的清晰功能上也更加全面。

  • state:全局变量(数据)

  • actions:全局方法(函数)→你要的全局方法就写这里Pinia

  • getters:全局计算属性

示例

import { defineStore } from 'pinia' ​ export const useSysStore = defineStore('sys', { // 全局变量 state: () => ({ sysname: '银行对账系统', }), // 全局方法(写在这里!) actions: { // 同步全局方法 setSysName(model) { }, // 异步全局方法(例如:请求后端再改名字) async fetchSysName() { const res = await fetch('/api/sysname') const data = await res.json() this.sysname = data.name }, // 方法里调用另一个方法 resetAndSet(model) { this.$reset() // 重置state this.setSysName(model) } } })

2.指令

a). v-model

Vue 3 允许通过参数绑定多个 v-model:

内置修饰符

修饰符作用适用场景
.lazy改为change事件触发减少频繁更新
.number自动转为数字数字输入
.trim去除首尾空格文本输入

自定义修饰符(Vue 3)

父组件使用:

<template> <MyComponent v-model.capitalize="message" /> </template>

子组件接收修饰符:

<script setup lang="ts"> interface Props { modelValue: string modelModifiers?: { capitalize?: boolean } } const props = defineProps<Props>() const emit = defineEmits<{ (e: 'update:modelValue', value: string): void }>() watchEffect(() => { if (props.modelModifiers?.capitalize) { emit('update:modelValue', props.modelValue.toUpperCase()) } }) </script>

3.父子组件传值

a).defineProps父传子(参数)

Vue 组件是独立封闭的。子组件不能直接用父组件里的变量。想让子组件拿到父组件的数据,必须通过 props 传递,相当于父传子的数据通道。

核心规则

  1. 父 → 子 单向传递(子不能改 props)

  2. 子组件用 defineProps 接收

  3. 接收后可以直接在模板 / JS 里使用

  4. 父组件数据变了,子组件会自动更新(响应式)

b).defineEmits子传父(事件)

子组件不能直接改父组件的数据,必须发一个事件,让父组件接收。

// 子组件 <script setup> // 1. 定义要发送的事件名 const emit = defineEmits(['sendMsg']) ​ function sendToParent() { // 2. 发送事件 + 数据 emit('sendMsg', '我是子组件发来的消息') } </script> ​ <template> <button @click="sendToParent">点我发给父组件</button> </template>

父组件监听子组件发出的事件,就能拿到值。

<script setup> function getMsg(data) { console.log('收到子组件消息:', data) } </script> ​ <template> <!-- 监听子组件的 sendMsg 事件 --> <Child @sendMsg="getMsg" /> </template>

4.ref、reactive、watch

  • ref:用来定义简单类型数据(数字、字符串、布尔)

  • reactive:用来定义复杂类型数据(对象、数组)

ref作用

监听简单数据类型的响应式:数字、字符串、布尔值

<script setup> import { ref } from 'vue' ​ // 定义响应式变量 const count = ref(0) const name = ref('张三') const isShow = ref(true) </script>

使用规则:

  • 模板里不用 .value

  • JS 里必须用 .value

<template> <div>{{ count }}</div> <!-- 不用 .value --> </template> ​ <script setup> console.log(count.value) // JS 里必须 .value count.value = 100 </script>
reactive作用

监听复杂数据类型的响应式:对象、数组

<script setup> import { reactive } from 'vue' ​ // 对象 const user = reactive({ name: '李四', age: 20 }) ​ // 数组 const list = reactive([1,2,3]) </script>

使用规则:

  • 永远不用 .value

  • 直接用属性即可

<template> <div>{{ user.name }}</div> </template> ​ <script setup> user.name = '王五' </script>

常见问题:reactive 不能直接重新赋值

const user = reactive({ name: '张三' }) ​ // ❌ 错误,会丢失响应式 user = { name: '李四' } ✅ 正确: // 改属性 user.name = '李四' ​ // 或用 Object.assign Object.assign(user, { name: '李四' })

对比表

特性refreactive
支持类型简单类型 + 对象 / 数组只能 对象 / 数组
JS 访问必须 .value不用 .value
模板访问不用 .value不用 .value
重新赋值可以不推荐直接赋值
使用场景单个变量对象、数组

5.API

a).h()渲染函数

创建虚拟 DOM 节点 (vnode)。

  • 详细信息

    第一个参数既可以是一个字符串 (用于原生元素) 也可以是一个 Vue 组件定义。第二个参数是要传递的 prop,第三个参数是子节点。

    当创建一个组件的 vnode 时,子节点必须以插槽函数进行传递。如果组件只有默认槽,可以使用单个插槽函数进行传递。否则,必须以插槽函数的对象形式来传递。

    为了方便阅读,当子节点不是插槽对象时,可以省略 prop 参数。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/19 18:29:57

深入解析PowerPC 603总线:并发、弹性与一致性协议实战

1. 项目概述&#xff1a;为什么我们需要深入理解PowerPC 603的总线如果你是一位嵌入式系统工程师&#xff0c;或者对90年代中后期那些经典的高性能RISC处理器设计着迷&#xff0c;那么PowerPC 603绝对是一个绕不开的里程碑。它不像同期的x86处理器那样家喻户晓&#xff0c;但在…

作者头像 李华
网站建设 2026/6/19 18:27:01

大数据志愿填报冲稳保搭配策略

大数据技术在志愿填报中的应用&#xff0c;能够有效提升录取概率。合理搭配冲、稳、保院校梯度&#xff0c;需要结合分数、位次、专业热度等多维度数据。CDA数据分析师证书持有者通常更擅长利用数据分析工具优化填报方案。冲稳保院校梯度定义类型录取概率目标定位数据依据冲20%…

作者头像 李华
网站建设 2026/6/19 18:26:21

深入解析S12XS MCU Flash模块:从ECC保护到实战编程指南

1. 项目概述&#xff1a;为什么需要深入了解MCU的Flash模块&#xff1f;在嵌入式开发领域&#xff0c;尤其是汽车电子、工业控制这些对可靠性要求极高的场景里&#xff0c;微控制器&#xff08;MCU&#xff09;的Flash存储器远不止是一个简单的“硬盘”。它承载着系统的“灵魂”…

作者头像 李华
网站建设 2026/6/19 18:25:08

STM32F103温度控制系统:如何实现±0.5°C的高精度PID控制?

STM32F103温度控制系统&#xff1a;如何实现0.5C的高精度PID控制&#xff1f; 【免费下载链接】STM32 项目地址: https://gitcode.com/gh_mirrors/stm322/STM32 在工业自动化、实验室设备和智能家居应用中&#xff0c;精准的温度控制是确保系统稳定运行的关键。传统的开…

作者头像 李华
网站建设 2026/6/19 18:24:08

结合区域运营经验,分享本地化GEO运营独特优势

做搜索运营二十年&#xff0c;我完整经历了传统关键词搜索、移动生态搜索到如今AI大模型智能检索的三轮底层变革。很多人以为GEO只是SEO的简单升级&#xff0c;只要批量写内容、覆盖关键词就能拿流量。但在2026年AI语义检索全面普及之后&#xff0c;这套老旧逻辑已经彻底失效。…

作者头像 李华
网站建设 2026/6/19 18:22:33

计算机毕业设计之东青家教预约系统的设计与实现

随着网络科技的不断发展以及人们经济水平的逐步提高&#xff0c;网络技术如今已成为人们生活中不可缺少的一部分&#xff0c;而信息管理系统是通过计算机技术&#xff0c;针对用户需求开发与设计&#xff0c;该技术尤其在各行业领域发挥了巨大的作用&#xff0c;相比于以前的传…

作者头像 李华