vue子组件props写法

本文档介绍了Vue子组件中props的使用,包括数组形式、对象形式的定义,并强调了camelCase与kebab-case的对应关系。同时,提到了props的类型检查,如String、Number、Boolean等,并指出在组件创建前prop验证时,实例属性不可用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Prop-Vue.js文档

camelCase (驼峰命名法) 的 prop 名需要使用其等价的 kebab-case (短横线分隔命名) 命名

1. props数组形式

props: ['title', 'likes', 'isPublished', 'commentIds', 'author']

2.props对象形式

props: {
  title: String,
  likes: Number,
  isPublished: Boolean,
  commentIds: Array,
  author: Object,
  callback: Function,
  contactsPromise: Promise // or any other constructor
  
  // 多个可能的类型
  propB: [String, Number],
  
  // 必填的字符串
  propC: {
    type: String,
    required: true
  },
  
  //带有默认值的数字
  propD: {
    type: Number,
    default: 100
  },
  
  // 带有默认值的对象
  propE: {
    type: Object,
    // 对象或数组默认值必须从一个工厂函数获取
    default: function () {
      return { message: 'hello' }
    }
  },
  
  // 自定义验证函数
  propF: {
    validator: function (value) {
      // 这个值必须匹配下列字符串中的一个
      return ['success', 'warning', 'danger'].indexOf(value) !== -1
    }
  }
}

当 prop 验证失败的时候,(开发环境构建版本的) Vue 将会产生一个控制台的警告。

注意:
注意那些 prop 会在一个组件实例创建之前进行验证,所以实例的属性 (如 data、computed 等) 在 default 或 validator 函数中是不可用的。

3.类型检查

type 可以是下列原生构造函数中的一个:

  • String
  • Number
  • Boolean
  • Array
  • Object
  • Date
  • Function
  • Symbol
### Vue3 中 Props 的响应式问题解决方案 在 Vue3 中,Props 是单向绑定的,这意味着它们是从父组件传递到子组件的数据流。然而,在某些情况下,开发者可能会遇到 Props子组件中失去响应式的现象。以下是针对该问题的具体分析和解决方案。 #### 1. 避免直接解构 Props 如果在子组件中直接对 `props` 进行解构(例如使用 ES6 的解构语法),会破坏其响应性。这是因为解构后的变量是一个普通的 JavaScript 对象或基本类型值,而不是 Vue 的代理对象[^1]。 ```javascript // 错误用法:解构后丢失响应式 const { var1 } = defineProps(['var1']); watch(var1, (newValue) => { console.log(newValue); // 不会被触发 }); ``` 为了避免这种情况,应该始终保留原始的 `props` 对象: ```javascript // 正确用法:不进行解构 const props = defineProps(['var1']); watch(() => props.var1, (newValue) => { console.log(newValue); // 可以正常监听变化 }); ``` --- #### 2. 使用 `toRefs` 或 `reactive` 当需要将 `props` 数据映射到可变状态时,可以借助 Vue 提供的工具函数 `toRefs` 和 `reactive` 来保持响应性[^3]。 ##### 方法一:使用 `toRefs` `toRefs` 能够将一个响应式对象转换为普通对象,其中每个属性都是指向原对象相应属性的 Ref。 ```javascript import { toRefs } from 'vue'; export default { props: ['var1'], setup(props) { const { var1 } = toRefs(props); watch(var1, (newValue) => { console.log('var1 changed:', newValue); }); return { var1 }; } }; ``` ##### 方法二:使用 `reactive` 如果希望创建一个新的响应式对象并同步更新来自 `props` 的数据,则可以通过组合方式实现。 ```javascript import { reactive, watch } from 'vue'; export default { props: ['var1'], setup(props) { const state = reactive({ localVar1: props.var1, }); watch( () => props.var1, (newVal) => { state.localVar1 = newVal; } ); return { localVar1: state.localVar1 }; }, }; ``` --- #### 3. 处理数组或对象类型的 Props 对于复杂数据结构(如数组或对象),Vue3 默认支持深层响应式机制。但如果发现某个 Prop 修改未被检测到,可能是由于以下原因造成的[^4]: - **错误的操作方法**:直接替换整个数组或对象实例而非修改现有内容。 ```javascript // 错误写法:直接覆盖数组 this.arrayProp = newArray; // 正确写法:通过 push/pop/splice 等方法动态调整 this.arrayProp.push(newItem); ``` - **深拷贝问题**:部分场景下可能需要手动通知 Vue 更新视图。 ```javascript import { nextTick } from 'vue'; export default { props: ['objectProp'], methods: { updateObject() { this.objectProp.newKey = 'value'; // 修改对象内部字段 nextTick(() => { console.log('View updated'); }); }, }, }; ``` --- #### 4. Pinia 响应式管理 Pinia 是 Vue3 推荐的状态管理库之一,它基于 Composition API 构建,能够很好地解决跨组件间共享状态的问题。如果多个组件之间存在频繁交互需求,建议引入 Pinia 替代传统的 Props/Events 方式。 示例代码如下: ```javascript // store.js import { defineStore } from 'pinia'; export const useSharedState = defineStore('shared', { state: () => ({ sharedValue: '', }), }); // ComponentA.vue <script> import { useSharedState } from './store'; export default { setup() { const store = useSharedState(); return { store }; }, }; </script> <!-- ComponentB.vue --> <script> import { useSharedState } from './store'; export default { setup() { const store = useSharedState(); return { store }; }, }; </script> ``` 这样即可轻松实现在不同层次级联关系下的双向通信功能而无需担心性能损耗或者逻辑混乱等问题发生。 --- ### 总结 以上介绍了几种常见情况及其对应的修复措施,具体选择取决于实际应用场景以及团队编码习惯等因素影响。务必牢记一点——永远不要试图改变由外部传来的只读型参数!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值