vue 中 props 用法使用总结和示例演示

以下是 Vue 中 props 的用法总结及示例演示:

一、核心作用与基本原则

  1. 核心作用

    • 父子组件通信props 是父组件向子组件传递数据的单向通道,用于实现组件间的数据共享[1][3][7]。
    • 数据验证与规范化:通过类型声明、必填项设置、默认值等确保数据合理性[1][2][5]。
  2. 基本原则

    • 单向数据流:数据只能从父组件流向子组件,子组件不可直接修改 props(若需修改需通过事件通知父组件)[1][3][5]。
    • 命名规范:父组件传递时使用短横线分隔(kebab-case),子组件定义时使用驼峰式(camelCase)[3][5]。

二、使用方法详解

1. 定义 props
形式 适用场景 示例
数组 简单声明接收的属性名 props: ['title', 'count']
对象 详细配置类型、默认值等 props: { title: String, count: { type: Number, default: 0 } }
2. 类型检查与验证

支持的类型包括 StringNumberBooleanArrayObjectFunctionSymbol 等[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>

四、注意事项

  1. 禁止直接修改 props:子组件应通过 $emit 触发事件通知父组件修改数据[1][3][5]。
  2. 引用类型默认值:必须使用工厂函数返回新对象/数组,避免多个实例共享同一引用[5][7]。
  3. prop 属性处理:未声明的属性会绑定到子组件的根元素,可通过 inheritAttrs: false$attrs 手动处理[5]。
  4. Vue 3 弃用 .sync:改用 v-model 实现双向绑定[5]。

总之,通过合理使用 props,可以实现父子组件间高效、安全的数据交互。在实际开发中,根据项目需求选择合适的 props 设置方式,能够提高代码的可维护性和稳定性。

转载请说明出处内容投诉
CSS教程网 » vue 中 props 用法使用总结和示例演示

发表评论

欢迎 访客 发表评论

一个令你着迷的主题!

查看演示 官网购买