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,支持类型、必传、默认值、自定义校验,数组形式仅适用于简单场景,掌握它能让组件间的数据传递更规范、更健壮。

相关推荐
GreenTea12 小时前
GrokBot 核心成员 Lauren Tan:每月交付 2000 个 PR 的人,是怎么用 AI 的
前端·后端·架构
mCell13 小时前
用 Knip 清理 AI Coding 留下的冗余代码
前端·ai编程·前端工程化
dy171713 小时前
vue2树节点刷新后定位到上一节点展开
vue.js
笃行35014 小时前
使用Rokid AIUI做了一个童年推箱子游戏
前端
excel15 小时前
前端加密的作用与使用场景
前端
计算机魔术师16 小时前
纽约时报版权诉讼披露:微软高管内部称训练 AI 是人类历史上最大规模劳动窃取
前端
去伪存真16 小时前
大模型的参数量为什么那么大?
前端·人工智能
IT_陈寒16 小时前
Java空指针这次真把我坑惨了
前端·人工智能·后端
高级程序源17 小时前
django大学生创新创业项目管理系统94923-计算机课程设计、毕业设计
javascript·vue.js·spring boot·后端·python·django·课程设计
八荒启·交互动画17 小时前
# Web特效020—让 Web 特效真正动起来:时间循环应该怎么接
前端·webgl·网页特效·八荒启-交互动画·八荒启