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>
相关推荐
OpsEye几秒前
大模型会话里的手机号、身份证,怎么自动脱敏?
javascript·ai编程
Lvan的前端笔记1 分钟前
docker:基于docker的前端部署方案
前端·docker·状态模式
程序人生8881 分钟前
从“把隐私文件上传到别人云端“到本地可控:DocConverter Web 立项初心与架构选型
前端·图像处理·人工智能·opencv·架构·ocr·文心一言
开开心心就好9 分钟前
视频里的图片怎么提取?双击一下就导出
java·前端·人工智能·spring·智能手机·intellij-idea·excel
爱喝水的小周12 分钟前
实验十 Vue‑Router 王者荣耀战绩查询 APP 开发实践
前端·javascript·vue.js
yexianglunbai12 分钟前
Vue 3 全面详解:从核心特性到工程化实践
前端·javascript·vue.js
传人once14 分钟前
选择文件按钮样式如何美化
前端·html·css3·jquery·html5
parade岁月29 分钟前
告别 Deno 时代?运行时进入一年倒计时,Deno 团队并入 Cloudflare
前端
Lucky_Turtle33 分钟前
【HTML】前端页面禁止缩放
前端·html
孟陬38 分钟前
JavaScript 反引号(` backtick)和双引号的不完全等价 ≠ 场景
javascript·node.js·bun