Vue 3 开发中遇到的报错(2)

一、响应式系统相关

  1. Cannot read property 'value' of null
    场景 :组合式 API 中访问 ref 的时机不当
    解决

    vue 复制代码
    <script setup>
    import { ref, onMounted } from 'vue'
    const myRef = ref(null)
    
    onMounted(() => {
      console.log(myRef.value) // 确保在挂载后访问
    })
    </script>
    <template>
      <div ref="myRef"></div>
    </template>
  2. 响应式对象解构丢失响应性
    隐秘点 :使用 ES6 解构 reactive 对象
    正确做法

    javascript 复制代码
    import { reactive, toRefs } from 'vue'
    
    const state = reactive({ count: 0 })
    // 错误:const { count } = state 
    const { count } = toRefs(state) // 保持响应性

二、组合式 API 陷阱

  1. provide/inject 未生效
    常见原因 :未在顶层调用 provide

    javascript 复制代码
    // 错误:在条件语句中调用
    if (condition) {
      provide('key', value) // 将失效
    }
  2. 异步组件 Suspense 报错
    隐秘错误:未处理异步边界

    vue 复制代码
    <Suspense>
      <template #default>
        <AsyncComponent />
      </template>
      <template #fallback>
        Loading... <!-- 必须提供降级内容 -->
      </template>
    </Suspense>

三、模板编译问题

  1. v-model 参数不匹配
    Vue 3 变更:需显式指定参数

    vue 复制代码
    <!-- 错误:<MyComponent v-model="value" /> -->
    <MyComponent v-model:title="value" /> <!-- 正确 -->
  2. <script setup> 的变量未暴露
    隐秘点 :使用 $refs 访问子组件方法

    vue 复制代码
    <!-- 子组件 -->
    <script setup>
    defineExpose({ publicMethod: () => {} }) // 必须显式暴露
    </script>
    
    <!-- 父组件 -->
    <Child ref="childRef" />
    <script setup>
    const childRef = ref(null)
    childRef.value?.publicMethod() // 安全访问
    </script>

四、状态管理相关

  1. Pinia 的 storeToRefs 误用
    错误现象:修改属性不触发更新

    javascript 复制代码
    import { storeToRefs } from 'pinia'
    
    const store = useStore()
    // 错误:const { count } = store
    const { count } = storeToRefs(store) // 保持响应性
    
    count.value++ // 正确触发更新
  2. Vuex 4 的 useStore 报错
    原因:未在根组件注入 store

    js 复制代码
    // main.js
    import { createApp } from 'vue'
    import store from './store'
    createApp(App).use(store).mount('#app')

五、TypeScript 特有错误

  1. 模板类型推断失败
    解决:使用 Volar 插件 + 类型声明

    vue 复制代码
    <script setup lang="ts">
    defineProps<{ 
      title: string   // 基于 TS 的类型声明
    }>()
    </script>
  2. 泛型组件类型丢失
    方案 :使用 h 函数渲染

    ts 复制代码
    import { h } from 'vue'
    const GenericComponent = <T>(props: { data: T[] }) => 
      h('div', props.data.map(d => d.toString()))

六、构建工具相关

  1. process.env 未定义
    Vite 方案

    js 复制代码
    import.meta.env.VITE_API_KEY // 需使用 VITE_ 前缀
  2. 动态导入组件报错
    正确写法

    vue 复制代码
    <script setup>
    import { defineAsyncComponent } from 'vue'
    const AsyncComp = defineAsyncComponent(() =>
      import('./components/AsyncComp.vue')
    )
    </script>
相关推荐
海上彼尚16 分钟前
Nodejs也能写Agent - 16.LangGraph篇 - 条件分支与循环
前端·后端·langchain·node.js
To_OC1 小时前
从 “卡死半天” 到 “打字机效果”:大模型流式输出前端实现全记录
前端·javascript·llm
rockey6271 小时前
基于AScript的JavaScript脚本语言发布啦
javascript·c#·.net·js·script
SoaringHeart2 小时前
Flutter最佳实践:键盘辅助视图输入框天添加图片附件
前端·flutter
kyriewen2 小时前
我看完这篇安全论文——AI推荐的npm包,92%是编出来的
前端·javascript·ai编程
心中有国也有家3 小时前
AtomGit Flutter 鸿蒙客户端:Canvas 绘制进阶-路径、渐变与混合模式
android·javascript·flutter·华为·harmonyos
小心我捶你啊3 小时前
数据采集和Web解锁不是一回事,从用途到规则区分
前端·爬虫·网络协议
hunterandroid4 小时前
[鸿蒙从零到一] ArkUI 基础组件实战:Text、Image、Button 与 TextInput
前端
fsssb4 小时前
Chromium 源码学习笔记(五):一次点击,在进入 JS 之前先经历了什么?
前端