vue中的props

一. 介绍

作为组件间通信方式的一种,props是用于实现父子组件传值的一种方式,可以让子组件接收并使用父组件传递过来的数据。

父组件通过属性的形式给子组件传值,子组件通过定义props来声明接收这些参数,且props是只读的。子组件不能直接修改props,会触发警告。如果想基于props修改数据,可在子组件内部定义计算属性实现。

二. 使用方法

子组件声明 Props(两种方式)

子组件需要先明确声明要接收哪些 Props,推荐使用对象形式(支持类型校验、默认值、自定义验证),基础场景也可以用数组形式。

方式 1:数组形式(简单场景)

javascript 复制代码
<template>
  <div>
    <p>接收的字符串:{{ msg }}</p>
    <p>接收的数字:{{ count }}</p>
  </div>
</template>

<script setup>
// 仅声明要接收的Props名称,无校验
const props = defineProps(['msg', 'count'])
</script>

方式 2:对象形式(推荐,带完整校验)

javascript 复制代码
<template>
  <div>
    <p>姓名:{{ name }}</p>
    <p>年龄:{{ age }}</p>
    <p>爱好:{{ hobbies.join('、') }}</p>
  </div>
</template>

<script setup>
// 声明Props并添加校验规则
const props = defineProps({
  // 基础类型校验
  name: String,
  // 多个可能的类型
  age: [Number, String],
  // 带默认值 + 类型校验 + 必传校验
  hobbies: {
    type: Array,
    required: true, // 必传
    default: () => [] // 数组/对象的默认值必须用函数返回(避免引用类型共享)
  },
  // 自定义验证规则
  score: {
    type: Number,
    validator: (value) => {
      // 验证分数必须在0-100之间
      return value >= 0 && value <= 100
    }
  }
})
</script>

父组件传递 Props

父组件通过属性绑定的方式给子组件传值,区分 "静态传值" 和 "动态传值":

javascript 复制代码
<template>
  <div>
    <!-- 静态传值(直接传字符串) -->
    <Child name="张三" />

    <!-- 动态传值(绑定变量/表达式,用v-bind/:) -->
    
    <Child 
      :name="username" 
      :age="18" 
      :hobbies="['打球', '看书']"
      :score="95"
    />
  </div>
</template>

<script setup>
import Child from './Child.vue';

// 父组件的数据源
const username = '李四'
</script>

子组件使用 Props

子组件通过defineProps返回的props对象访问接收的值,注意:

  • Props 是只读 ,子组件不能直接修改(比如props.age = 20会报错);

  • 如果需要基于 Props 修改数据,可在子组件内定义响应式变量接收 Props 的值:

javascript 复制代码
<template>
  <div>
    <p>原始年龄:{{ age }}</p>
    <p>修改后的年龄:{{ newAge }}</p>
    <button @click="newAge++">增加年龄</button>
  </div>
</template>

<script setup>
import { ref } from 'vue';

const props = defineProps({
  age: Number
})

// 定义响应式变量接收Props值,后续修改这个变量
const newAge = ref(props.age);

</script>

Props 的大小写规范

  • HTML 属性不区分大小写,因此父组件传递 Props 时,驼峰命名 要转为短横线命名
javascript 复制代码
<!-- 父组件:驼峰myMessage转为短横线my-message -->
<Child :my-message="hello" />

<!-- 子组件:仍用驼峰声明 -->
const props = defineProps({
  myMessage: String
})

三、注意事项

  1. 单向数据流 :父组件 Props 更新,子组件会自动更新;但子组件不能修改 Props,否则破坏数据流向(如需修改,可通过emit通知父组件修改);

  2. 默认 值类型 :数组 / 对象的默认值必须用函数返回(避免多个组件实例共享同一个引用);

  3. 必传校验required: true时,父组件未传值会触发控制台警告;

  4. 类型校验失败:Vue 会在开发环境控制台给出警告,但不会阻止运行。

Props 是 Vue 组件通信最基础、最常用的方式,推荐用对象形式声明 Props,支持类型、必传、默认值、自定义校验,数组形式仅适用于简单场景,掌握它能让组件间的数据传递更规范、更健壮。

相关推荐
Csvn16 分钟前
🧩「找不到模块」排查全记录——Monorepo 下 TypeScript 路径别名的 5 种「不通」与根治方案
前端
腻害兔23 分钟前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:字典、短信、邮件、通知——后台系统的“基础设施四件套“!
java·前端·vue.js·产品经理·ai编程
CodexDave39 分钟前
MySQL事务隔离级别与MVCC机制解析
前端·数据库·mysql·nginx·性能优化·负载均衡
Ai_easygo2 小时前
AI Agent开发入门——从ReAct到Tool Calling,拆解Agent的底层运行逻辑
前端·人工智能·react.js
研☆香2 小时前
分析制作html页面,如何划分页面结构
前端
腻害兔2 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:支付模块 yudao-module-pay,一个让产品经理都看懂的支付中台设计
java·前端·vue.js·产品经理·ai编程
kyriewen2 小时前
我扒了最近的前端面经——2026年面试不背八股文了,考这5样
前端·面试·ai编程
IT_陈寒2 小时前
Redis的持久化配置把我坑惨了:你以为数据安全了?
前端·人工智能·后端
小徐_23333 小时前
uni-app 项目别再从零搭了!3 个 Wot UI 起手模板怎么选?
前端·uni-app
张元清3 小时前
React useResizeObserver Hook:追踪元素尺寸变化(2026)
javascript·react.js