You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue3组合式API setup函数中如何正确获取数组类型的props值?

问题根源

你代码的核心问题是setup函数的入参解构错误:
Vue3的setup函数第一个入参本身就是完整的props对象,你代码中写setup({modelValue, props} : any, ...)相当于从props对象里额外解构一个叫props的子属性,这个属性根本不存在,导致你后续用到的props变量是undefined,自然无法读取items的值。
模板能正常遍历items是因为模板默认绑定全局的$props对象,不受你setup里错误解构的影响。

修复方案

第一步:修正setup入参写法

两种可选写法,根据你的使用习惯选择即可:

// 写法1:保留props整体引用,适合需要频繁访问多个props属性的场景
setup(props : any, {emit} : any ) {
  const modelValue = props.modelValue
  // 后续逻辑
}

// 写法2:直接解构所有需要的props属性,代码更简洁
setup({modelValue, items} : any, {emit} : any ) {
  // 后续逻辑
}

第二步:正确初始化selected变量

优先用ref包裹selected(后续要替换整个选中值的操作更简单),同时加空值判断避免父组件初始传入空数组时报错:

import { ref, watch } from 'vue'

setup(props : any, {emit} : any ) {
  let is_active = ref(false);
  // 初始化加空值兜底
  let selected = ref(
    props.items?.length 
      ? {
          label: props.items[0].label,
          icon: props.items[0].icon,
          class: props.items[0].class
        }
      : {}
  );

  // 若需要父组件动态修改items数组时,自动更新selected为新数组的第一个元素,加这段监听逻辑
  watch(() => props.items, (newItems) => {
    if (newItems?.length) {
      selected.value = {
        label: newItems[0].label,
        icon: newItems[0].icon,
        class: newItems[0].class
      }
    }
  }, { deep: true, immediate: true })

  // 其余业务逻辑
}

如果你确实想用reactive,只要修正入参后直接写let selected = reactive(props.items[0] || {})也可以正常生效。

内容的提问来源于stack exchange,提问作者Rade Iliev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 19:24:01