Vue3 开发必踩的坑,看你掉了几个

0 阅读1分钟

正文

大家在 Vue3 + script setup 开发中,经常会遇到一些明明代码看着没问题,却死活不生效的场景。今天整理了高频问题 + 可直接复制的修复方案,建议收藏。

1. ref 获取 DOM 为 undefined

问题

<script setup>
const dom = ref(null)
console.log(dom.value) // undefined
</script>
<template>
  <div ref="dom"></div>
</template>

原因:DOM 还没挂载就执行了代码。

解决

onMounted(() => {
  console.log(dom.value)
})

2. reactive 赋值后失去响应式

问题

const data = reactive({ list: [] })
data.list = await fetchList() // 看似没问题,有时会失效

原因:直接覆盖会破坏响应式代理。

解决

data.list = [...newList]
// 或
Object.assign(data, { list: newList })

3. computed 不更新

原因:依赖没有被正确追踪,比如依赖异步数据。

解决:确保依赖是响应式数据,不要在 computed 里做异步。


4. defineProps 解构失去响应式

错误写法

const { name } = defineProps(['name'])

解决

const props = defineProps(['name'])
const name = computed(() => props.name)

或使用 toRefs


5. watch 监听 reactive 对象不触发

解决:开启 deep

watch(data, () => {}, { deep: true })

6. 父组件调用子组件方法报错

解决:子组件必须用 defineExpose 暴露

const fn = () => {}
defineExpose({ fn })

7. 样式 scoped 后修改第三方组件样式无效

解决

:deep(.el-button) {
  color: red;
}

8. 页面刷新后路由守卫获取不到 store 数据

原因:路由执行比 Pinia/Vuex 初始化快。

解决:在路由守卫里加 nextTick 或等待初始化完成。


总结

Vue3 大部分坑都来自:

  • 生命周期执行顺序
  • 响应式丢失
  • 作用域隔离
  • 异步时序

把这些坑记住,开发效率至少提升 50%。

个人观点·仅供参考