当前位置: 首页 > news >正文

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 参数。

http://www.jsqmd.com/news/1043750/

相关文章:

  • 2026年兰山区黄金回收靠谱商家排名:认准这三家,卖金不踩坑 - 钦扬网络
  • 一文看懂,从 Prompt 到 Loop 的 AI 工程进化
  • Infoseek品牌公关,全周期护航企业品牌长效声誉资产
  • 2026高端外贸网站定制公司深度测评,从技术架构、适配维度选型
  • html表格中的单元格合并
  • 2026无锡靠谱黄金回收榜单,靠资质突围,变现全程无套路 - 奢侈品回收评测
  • MC68HC908JG16系统模块深度解析:SIM、MON与TIM实战指南
  • 2026广州黄金回收实测榜单,收的顶稳居榜首,高价靠谱双在线 - 奢侈品回收测评
  • 深入解析MC68HC908EY16A ESCI接收器:从过采样原理到实战避坑
  • 广东饭堂承包哪家专业实力强
  • 无锡不锈钢中厚板供应商推荐:2026实测甄选,适配化工/重工/压力容器全场景 - wxxwlm
  • MooTool 1.7.7 发布:Java 编写的开发者桌面小工具集更新多项功能
  • 解码产品战略:从C端体验到B端效能再到G端治理
  • 2026厦门黄金回收靠谱推荐|收的顶权威合规,避坑攻略速藏 - 奢侈品回收测评
  • 车载诊断实战:DM1故障码的报文配置与解析指南
  • 2026实测无锡黄金回收:靠谱渠道推荐,本土机构深度测评 - 奢侈品回收评测
  • 哈尔滨黄金回收套路大起底,合扬回收实测打破潜规则 - 奢侈品交易观察员
  • 在Windows上享受原生B站体验:Bili.UWP如何重新定义你的追番方式
  • 2026年厦门名表回收避坑实录:卖表前你要知道的那些没写在招牌上的事 - 奢品小当家
  • 2026年6月正规苏州模温机厂家名单表:高温/防爆/PLC/冷热温控设备定制 - 海棠依旧大
  • 杭州闲置黄金变现去哪?正规回收大盘价上门收金无套路 - 奢品小当家
  • 2026年机器人锂电池厂家推荐:24 年定制锂电池源头厂商选型参考
  • 夸克网盘突破下载限制教程
  • 黑苹果配置革命:OpCore Simplify图形化工具终极指南
  • 2026年金属表面处理清洗剂排行榜:实测好用推荐榜TOP5 - 官方资讯
  • 2026年众智商学院SCMP报名前需要核对哪些信息?资料领取试听课和班期确认指南 - 众智商学院官方
  • 金价冲高阶段如何抛售利润最大?杭州收的顶专属卖金实操技巧分享 - 奢侈品回收评测
  • 深度解析 Hermes-WebUI:打造 AI 辅助编程的工程化闭环
  • 杭州回收行业内卷加剧,收的顶凭定价与服务优势拉开行业差距 - 奢侈品回收评测
  • Slint声明式GUI框架:3大核心技术革新嵌入式UI开发效率提升10倍