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

Vue: 组件 Props

一、Props 声明方式

声明方式代码示例特点
数组形式defineProps(['foo'])简单易用,仅声明 prop 名
对象形式defineProps({ foo: String })可声明类型、默认值、是否必填等
TypeScript 类型标注defineProps<{ foo?: string }>()适用于 TypeScript 项目,类型安全

二、Props 类型声明

defineProps({propA: Number, // 基础类型propB: [String, Number], // 多种类型propC: { type: String, required: true }, // 必填项propD: { type: [String, null], required: true }, // 可为 null 的必填项propE: { type: Number, default: 100 }, // 带默认值propF: { type: Object, default: () => ({ message: 'hello' }) }, // 对象默认值propG: { validator: (value) => ['success', 'warning', 'danger'].includes(value) } // 自定义校验
})

三、响应式 Props 解构

1. 解构 Props
const { foo } = defineProps(['foo'])
2. 响应式特性
watchEffect(() => {console.log(foo) // 在 3.5+ 中,当 foo 变化时重新执行
})
3. 默认值解构
const { foo = 'hello' } = defineProps<{ foo?: string }>()

四、Prop 传递方式

传递方式示例说明
静态值<MyComponent title="Hello" />传递字符串常量
动态绑定<MyComponent :title="post.title" />传递变量或表达式
对象绑定<MyComponent v-bind="post" />一次性传递对象所有属性

五、Prop 类型传递示例

类型静态示例动态示例
Number<BlogPost :likes="42" /><BlogPost :likes="post.likes" />
Boolean<BlogPost is-published /><BlogPost :is-published="post.isPublished" />
Array<BlogPost :comment-ids="[234, 266, 273]" /><BlogPost :comment-ids="post.commentIds" />
Object<BlogPost :author="{ name: 'Veronica' }" /><BlogPost :author="post.author" />

六、Prop 校验规则

defineProps({propA: Number,propB: [String, Number],propC: { type: String, required: true },propD: { type: [String, null], required: true },propE: { type: Number, default: 100 },propF: { type: Object, default: () => ({ message: 'hello' }) },propG: { validator: (value) => ['success', 'warning', 'danger'].includes(value) }
})

七、Prop 类型检查

类型示例类型检查方式
StringStringtypeof value === 'string'
NumberNumbertypeof value === 'number'
BooleanBooleantypeof value === 'boolean'
ArrayArrayArray.isArray(value)
ObjectObjecttypeof value === 'object'
DateDatevalue instanceof Date
FunctionFunctiontypeof value === 'function'
自定义类Personvalue instanceof Person

八、Boolean 类型转换规则

声明类型示例转换结果
[Boolean, Number]<MyComponent disabled />true
[Boolean, String]<MyComponent disabled />true
[Number, Boolean]<MyComponent disabled />true
[String, Boolean]<MyComponent disabled />""

九、单向数据流原则

所有 props 都遵循单向绑定原则:props 因父组件的更新而变化,自然地将新的状态向下流往子组件,而不会逆向传递。

不正确的做法:
props.foo = 'bar' // ❌ 警告!prop 是只读的!
正确做法:
// 1. 局部数据属性
const counter = ref(props.initialCounter)// 2. 计算属性
const normalizedSize = computed(() => props.size.trim().toLowerCase())

十、响应式传递解构的 Props

const { foo } = defineProps(['foo'])// 错误用法
watch(foo, /* ... */) // ❌ 传递的是一个值而不是响应式数据源// 正确用法
watch(() => foo, /* ... */) // ✅ 通过 getter 包装
useComposable(() => foo) // ✅ 推荐做法

十一、总结图表

1. Props 声明方式对比图
┌──────────────┬───────────────┬────────────────────┐
│   声明方式   │  适用场景     │   优点              │
├──────────────┼───────────────┼────────────────────┤
│ 数组形式     │ 简单声明      │ 简洁易用           │
│ 对象形式     │ 完整声明      │ 支持类型、默认值等 │
│ TS 类型标注  │ TS 项目       │ 类型安全           │
└──────────────┴───────────────┴────────────────────┘
2. Prop 类型检查机制
┌───────────────┐
│    类型声明   │
├───────────────┤
│  基础类型检查 │
│  多类型支持   │
│  默认值       │
│  自定义校验   │
└───────────────┘↓
┌──────────────────┐
│    运行时校验    │
├──────────────────┤
│  typeof 检查     │
│  instanceof 检查 │
│  自定义 validator│
└──────────────────┘↓
┌────────────────────┐
│    开发环境警告    │
└────────────────────┘
3. Prop 传递方式流程图
Prop 传递方式│├─ 静态值传递│   └─ <MyComponent title="Hello" />│├─ 动态绑定│   └─ <MyComponent :title="post.title" />│└─ 对象绑定└─ <MyComponent v-bind="post" />

十二、核心知识点

  1. 组件间通信机制

    • Props 是父组件向子组件传递数据的主要方式

    • 遵循单向数据流原则,避免子组件修改父组件状态

  2. 响应式系统

    • Vue 的响应系统基于属性访问跟踪状态

    • 在 3.5+ 版本中,解构的 props 仍保持响应性

  3. 类型校验机制

    • 可通过多种方式声明 props 类型

    • 支持运行时校验和 TypeScript 编译时校验

    • 自定义校验函数可实现复杂校验逻辑


文章转载自:

http://zFK6I3Cb.wcczg.cn
http://q2ueGAUx.wcczg.cn
http://yS7YoRQo.wcczg.cn
http://L6pcoQvz.wcczg.cn
http://EFB8strY.wcczg.cn
http://RLMDZTRh.wcczg.cn
http://N7ulBSYc.wcczg.cn
http://PySacYGv.wcczg.cn
http://DLOiufB9.wcczg.cn
http://zXBmYlXy.wcczg.cn
http://S4eEFuft.wcczg.cn
http://MNusXVhb.wcczg.cn
http://W70iOMIE.wcczg.cn
http://rtUoDoc7.wcczg.cn
http://LqVnGszA.wcczg.cn
http://LwC8Jd3r.wcczg.cn
http://Qf3QTky9.wcczg.cn
http://iIdRsCKr.wcczg.cn
http://pvzAjNzk.wcczg.cn
http://cSnw9tXN.wcczg.cn
http://O9sCgZUU.wcczg.cn
http://t8uOASk5.wcczg.cn
http://lzk4y1mC.wcczg.cn
http://XN6e0OP5.wcczg.cn
http://u6DIu3c1.wcczg.cn
http://WqAgMngW.wcczg.cn
http://rSWdoHPd.wcczg.cn
http://QAhD5E8H.wcczg.cn
http://ZNAgHCAP.wcczg.cn
http://ikuMKOGn.wcczg.cn
http://www.dtcms.com/a/386899.html

相关文章:

  • spring通过Spring Integration实现tcp通信
  • 改革企业治理架构,构建国有企业全面预算管理体系
  • 网络概述学习
  • VRRP 实验
  • confulence平台
  • 非许可型区块链
  • 如何使用词嵌入模型
  • 从一个想法到上线:Madechango项目架构设计全解析
  • pytest入门
  • 设计模式第二章(装饰器模式)
  • ​​解决大模型幻觉全攻略:理论、技术与落地实践​
  • qt QCandlestickSeries详解
  • 量化研究--高频日内网格T0策略研究
  • [Dify] 自动摘要与精炼:构建内容浓缩型工作流的实践指南
  • Windows安装mamba最佳实践(WSL ubuntu丝滑版)
  • 黑马头条_SpringCloud项目阶段一:环境搭建(Mac版本)
  • Java 设计模式全景解析
  • 【Python】OS模块操作目录
  • 深度学习基本模块:LSTM 长短期记忆网络
  • 初始化Vue3 项目
  • 耕地质量评价
  • MeloTTS安装实践
  • 国产化芯片ZCC3790--同步升降压控制器的全新选择, 替代LT3790
  • LeetCode 977.有序数组的平方
  • 佳易王个体诊所中西医电子处方管理系统软件教程详解:开方的时候可一键导入配方模板,自由添加模板
  • C#实现WGS-84到西安80坐标系转换的完整指南
  • rabbitmq面试题总结
  • 【Java初学基础】⭐Object()顶级父类与它的重要方法equals()
  • C语言初尝试——洛谷
  • Kaleidoscope for Mac:Mac 平台文件与图像差异对比的终极工具