vue3实战中关于 props 的一个细节问题

这是一个关于父子组件通过 props 传递 reactive 函数包装的一个值的一个问题
父组件及对应的模板

import { reactive } from 'vue'
import TreeMenu from './TreeMenu.vue'
const userInfo = reactive({
   // 省略其他参数
  userMenu: [], // 该用户菜单列表
})
const getMenuList = async () => { // 获取所有菜单列表
  const list = await api.getMenuList({
    userName: userInfo.userName, 
    userPwd: userInfo.userPwd
  })
  userInfo.userMenu = list
}
getMenuList()
<TreeMenu :userMenu="userInfo.userMenu"/>

子组件

const props = defineProps({
  userMenu: {
    type: Array,
    default() {
      return []
    }
  }
})
console.log(props) // 该对象中的 userName 总是有值
console.log(props.userMenu) // 该对象始终是一个空数据

控制台中的结果(这个结果是我肉眼观察了5+以上,我不理解为什么会出现这种现象)

阅读 3.9k
1 个回答

因为 defineProps 只是一个语法糖,并不是一个真实存在的函数,它的作用在于告诉 vue 运行时工具,这里我们要引入一个变量。所以不能用普通变量的方式去看待它。

所以你不能当它是个普通函数那样,期待在后面 console.log() 就能拿到你想要的值,因为它编译后不一定是什么样的执行顺序。至于你用 console.log(props) 有值而 console.log(props.userMenu) 没值,则基本是由于 console.log 出来的是对象指针,而不是对象快照,等你展开的时候,前者已经有值了,后者则还指向默认值的结果(default())所以是空的。

如果你需要单独使用 userMenu,可以用 const {userMenu} = toRefs(props)。因为 vue 是响应式的 MVVM 框架,所以任何时刻填充数据都可以渲染出正确的页面。

推荐问题
宣传栏