以下是 Vue 中 props 的用法总结及示例演示:
一、核心作用与基本原则
-
核心作用
-
父子组件通信:
props是父组件向子组件传递数据的单向通道,用于实现组件间的数据共享[1][3][7]。 - 数据验证与规范化:通过类型声明、必填项设置、默认值等确保数据合理性[1][2][5]。
-
父子组件通信:
-
基本原则
-
单向数据流:数据只能从父组件流向子组件,子组件不可直接修改
props(若需修改需通过事件通知父组件)[1][3][5]。 - 命名规范:父组件传递时使用短横线分隔(kebab-case),子组件定义时使用驼峰式(camelCase)[3][5]。
-
单向数据流:数据只能从父组件流向子组件,子组件不可直接修改
二、使用方法详解
1. 定义 props
| 形式 | 适用场景 | 示例 |
|---|---|---|
| 数组 | 简单声明接收的属性名 | props: ['title', 'count'] |
| 对象 | 详细配置类型、默认值等 | props: { title: String, count: { type: Number, default: 0 } } |
2. 类型检查与验证
支持的类型包括 String、Number、Boolean、Array、Object、Function、Symbol 等[2][5]。具体示例如下:
-
基础类型检查:
propA: Number。 -
多类型检查:
propB: [String, Number]。 -
必填项:
propC: { type: String, required: true }。 -
默认值:
propD: { type: Number, default: 100 }。 -
自定义验证函数:
propE: { validator: (value) => ['su***ess', 'warning', 'danger'].includes(value) }[2][5]。
3. 默认值设置
-
基本类型:直接赋值(如
default: 0)。 -
引用类型:需用工厂函数返回新对象/数组,避免多个实例共享同一引用[5][7]。示例如下:
-
user: { type: Object, default: () => ({ name: '匿名用户', age: 18 }) }。 -
tags: { type: Array, default: () => ['vue', 'javascript'] }[7]。
-
4. 动态与静态传递
- 静态传递:直接写入固定值(适用于固定数据)[3][6]。
-
动态传递:绑定父组件的
data或***puted属性(适用于变化数据)[3][6]。
5. Vue 3 特性
-
***position API:使用
defineProps声明props[4][7]。 -
TypeScript 支持:通过泛型或
PropType定义复杂类型[7]。示例如下:-
interface User { name: string; age: number }; const props = defineProps<{ user: User }>()。 -
book: { type: Object as PropType<Book>, required: true }[7]。
-
三、示例演示
1. 基础传递与渲染
父组件:
<template>
<Child***ponent :message="parentMessage" />
</template>
<script>
import Child***ponent from './Child***ponent.vue';
export default {
***ponents: { Child***ponent },
data() {
return { parentMessage: 'Hello from Parent!' };
}
};
</script>
子组件:
<template>
<p>{{ message }}</p>
</template>
<script>
export default {
props: {
message: { type: String, required: true } // 必填且为字符串
}
};
</script>
2. 类型验证与默认值
子组件:
props: {
age: {
type: Number,
default: 18, // 默认值
validator(value) { return value >= 0 && value <= 150; } // 自定义验证
},
hobbies: {
type: Array,
validator(value) { return value.length > 0; } // 至少一个元素
}
}
3. Vue 3 ***position API 示例
子组件:
const props = defineProps({
title: { type: String, required: true }, // 必填字符串
count: { type: Number, default: 0 }, // 可选数字,默认0
user: { // 对象类型
type: Object,
default: () => ({ name: 'Guest', age: 20 })
}
});
4. 动态传递与响应式更新
父组件:
<template>
<input v-model="parentMessage" placeholder="输入消息" />
<Child***ponent :message="parentMessage" />
</template>
<script>
import Child***ponent from './Child***ponent.vue';
export default {
***ponents: { Child***ponent },
data() {
return { parentMessage: '' };
}
};
</script>
子组件:
<template>
<div>
<p>{{ message }}</p> <!-- 实时响应输入 -->
</div>
</template>
<script>
export default {
props: { message: String }
};
</script>
四、注意事项
-
禁止直接修改
props:子组件应通过$emit触发事件通知父组件修改数据[1][3][5]。 - 引用类型默认值:必须使用工厂函数返回新对象/数组,避免多个实例共享同一引用[5][7]。
-
非
prop属性处理:未声明的属性会绑定到子组件的根元素,可通过inheritAttrs: false和$attrs手动处理[5]。 -
Vue 3 弃用
.sync:改用v-model实现双向绑定[5]。
总之,通过合理使用 props,可以实现父子组件间高效、安全的数据交互。在实际开发中,根据项目需求选择合适的 props 设置方式,能够提高代码的可维护性和稳定性。