当前位置: 首页 > news >正文

Vue3编程中更多常见书写错误场景

以下是Vue3编程中更多常见书写错误场景,涵盖响应式、组件、路由、状态管理、模板语法等多个维度:

错误场景分类错误示例问题所在正确示例
响应式API错误const arr = ref([1,2,3]); arr.push(4)ref数组直接调用数组方法无效(需通过.value访问原始数组)arr.value.push(4)
响应式API错误shallowRef({ name: '张三' }); obj.value.name = '李四'shallowRef仅监听.value的引用变化,修改内部属性不会触发更新使用refreactive;若需浅层响应,修改时替换整个对象:obj.value = { name: '李四' }
响应式API错误const state = reactive({ list: [] }); state.list = [1,2,3]直接替换reactive对象的属性(数组)会丢失响应性(破坏了原始代理)state.list.splice(0, state.list.length, ...[1,2,3])(修改原数组)
Props处理错误defineProps({ list: Array }),未指定默认值导致空值错误未设置默认值时,父组件未传list会导致listundefined,调用数组方法报错defineProps({ list: { type: Array, default: () => [] } })
Props处理错误子组件用watch(props.age, (newVal) => {})props是响应式对象,但直接解构或访问其属性(如props.age)作为watch源可能不触发watch(() => props.age, (newVal) => {})(用函数返回值作为源)
计算属性错误const total = computed(() => { if (list.value.length) return sum; })计算属性未处理所有分支返回值,可能导致返回undefined引发渲染错误const total = computed(() => list.value.length ? sum : 0)(确保所有路径有返回值)
计算属性错误const filteredList = computed(() => list.value.filter(...)),直接修改filteredList.value计算属性返回的是派生值,修改会导致不一致(应修改源数据)修改list.value,让计算属性自动更新
模板语法错误<input v-model="user.name" :value="user.name">v-model:value同时使用会冲突(v-model已包含:value@input仅保留v-model="user.name"
模板语法错误<div :class="{ active: isActive }, 'base-class'">:class的对象语法与字符串语法混用格式错误(应放在数组中)<div :class="[{ active: isActive }, 'base-class']">
模板语法错误<button @click="handleClick(1, $event)">点击</button>,函数中未接收事件传递$event但函数未定义参数接收,导致无法获取事件对象const handleClick = (num, e) => { console.log(e) }
自定义事件错误子组件emit('update:modelValue', newVal),但父组件用v-model:value自定义组件v-model默认绑定modelValue,需统一名称或显式指定参数子组件:emit('update:value', newVal),父组件:v-model:value="val"
自定义事件错误defineEmits({ 'update:age': (val) => val > 0 }),验证失败未处理事件验证函数返回false时,事件不会触发,但未给出错误提示导致调试困难验证函数中添加提示:(val) => { if (val <= 0) console.error('年龄无效'); return val > 0 }
生命周期钩子错误onMounted(() => { const timer = setInterval(...); }),未清理定时器组件卸载后定时器仍运行,导致内存泄漏onMounted(() => { const timer = setInterval(...); onUnmounted(() => clearInterval(timer)); })
生命周期钩子错误onBeforeMount中操作DOM元素(如document.getElementByIdonBeforeMount阶段DOM尚未挂载,无法获取元素onMounted中操作DOM
组合式API错误const { data } = useRequest(); watch(data, (newVal) => {})data可能是ref但未通过函数返回,watch无法监听(需确保源是响应式的)watch(() => data.value, (newVal) => {})
组合式API错误setup中定义const handleClick = () => { ... },模板中用@click="handleClick()"函数无需加括号(加括号会每次渲染重新创建函数)模板中直接@click="handleClick"
路由相关错误import { useRouter } from 'vue-router'; const route = useRouter()混淆useRouter(路由实例,用于导航)和useRoute(当前路由信息)import { useRoute } from 'vue-router'; const route = useRoute()
路由相关错误router.push({ path: '/user', params: { id: 1 } })pathparams同时使用时,params会被忽略(需用name配合paramsrouter.push({ name: 'user', params: { id: 1 } })
路由相关错误beforeRouteEnter中访问thisbeforeRouteEnter钩子中this未初始化,无法访问组件实例通过next(vm => { vm.xxx = ... })访问组件实例vm
Pinia状态管理错误defineStore('user', { state: () => ({ name: '' }), getters: { fullName: () => this.name } })getter中不能用this(应使用箭头函数或参数)getters: { fullName: (state) => state.name }
Pinia状态管理错误const userStore = useUserStore(); userStore.name = '李四',未在state定义修改未在state中声明的属性,不会触发响应式更新state中显式定义name: '',再修改
Pinia状态管理错误调用action:userStore.fetchUser(),未处理异步错误异步action可能失败,但未捕获错误导致应用崩溃try { await userStore.fetchUser() } catch (e) { console.error(e) }
自定义指令错误app.directive('my-dir', (el, binding) => { ... }),未处理更新逻辑函数式指令仅在mountedupdated时执行,但可能未正确区分两个阶段用对象形式:{ mounted: () => {}, updated: () => {} }
自定义指令错误v-my-dir="value",指令中用binding.valuevalue是响应式数据指令不会自动追踪响应式数据变化,value更新时指令不会重新执行配合watch在指令内监听value变化
组件注册错误全局注册组件:app.component('myComponent', MyComponent)组件名使用驼峰命名在模板中需转为kebab-case,可能导致引用错误(推荐全程kebab-case)app.component('my-component', MyComponent),模板中<my-component>
组件注册错误<script setup>中局部注册组件:import MyComponent; components: { MyComponent }<script setup>中导入的组件会自动注册,无需手动声明components选项直接import MyComponent,模板中使用<MyComponent>
动态组件错误<component :is="currentComponent" :key="currentComponent" />key与组件名绑定,切换时可能因组件名相同导致不重新渲染(应绑定唯一标识):key="componentId"(用唯一ID作为key)
动态组件错误const currentComponent = ref('MyComponent'),但组件未全局注册字符串形式的is需要组件已全局注册,否则无法识别直接绑定组件对象:const currentComponent = ref(MyComponent)
样式相关错误<style scoped> .child-class { color: red; } </style>,修改子组件样式无效scoped样式会限制仅作用于当前组件,无法直接修改子组件样式使用深度选择器:::v-deep .child-class { color: red; }
样式相关错误<style module> .active { ... } </style>,模板中用class="active"module样式需通过$style访问,直接使用类名无效<div :class="$style.active">
过渡动画错误<transition> <div v-if="show">内容</div> </transition>,无动画效果未定义过渡类(如v-enter-fromv-enter-active)导致动画不生效添加样式:.v-enter-active { transition: all 0.3s; }
过渡动画错误<transition-group> <div v-for="item in list" :key="item.id">,未设置过渡transition-group默认不会为子元素添加过渡,需显式定义或使用name属性<transition-group name="list">,并定义.list-enter-active等样式
v-model修饰符错误自定义组件中v-model.number,未处理修饰符父组件使用修饰符但子组件未解析,导致值类型错误(如字符串未转为数字)子组件defineProps({ modelValue: Number }),并在emit前转换类型
v-model修饰符错误<input v-model.trim="name" v-model.lazy="name">同一元素上使用多个v-model会冲突(修饰符应合并)<input v-model.trim.lazy="name">
事件修饰符错误<form @submit="handleSubmit">,未阻止默认提交行为表单默认会刷新页面,需阻止默认行为<form @submit.prevent="handleSubmit">
事件修饰符错误<div @click.stop="handleClick">,嵌套元素也用@click.stop内层stop会阻止事件冒泡到外层,可能导致外层事件无法触发仅在需要阻止冒泡的层级使用stop
依赖注入错误provide('user', ref('张三')),注入时const user = inject('user'),直接修改user.value子组件修改注入的响应式数据,违反单向数据流(应通过函数修改)提供修改函数:provide('setUser', (val) => user.value = val)
依赖注入错误inject('config'),注入的是普通对象,修改后父组件无感知注入的普通对象不具备响应性,修改不会同步到其他注入点提供响应式对象:provide('config', reactive({}))
TypeScript错误const count = ref(0); count.value = '123'TypeScript环境下,ref会自动推断类型,赋值不同类型会报错(需显式指定类型)const count = ref<number / string>(0); count.value = '123'
TypeScript错误defineProps<{ age: number }>(),父组件传字符串age="18"TypeScript类型校验失败,age期望数字但接收字符串父组件传数字:age="18"改为:age="18",或子组件兼容字符串类型(如defineProps<{ age: number
异步组件错误const AsyncComponent = () => import('./AsyncComponent.vue'),未处理加载状态异步组件加载时无过渡,可能导致界面闪烁使用defineAsyncComponentconst AsyncComponent = defineAsyncComponent(() => import('./AsyncComponent.vue'))
异步组件错误异步组件加载失败,未设置错误回调网络错误时组件加载失败,无错误提示导致用户体验差defineAsyncComponent({ loader: () => import(...), onError: (err) => console.error(err) })

这些场景覆盖了Vue3开发中从基础语法到高级特性的常见问题,涉及响应式原理、组件设计、路由交互、状态管理等核心环节。理解这些错误的本质(如响应式追踪机制、单向数据流、生命周期时机等),能更高效地排查问题并写出更健壮的代码。

http://www.dtcms.com/a/339180.html

相关文章:

  • 使用OpenCV计算灰度图像的质心
  • 云原生堡垒机渗透测试场景
  • 所有普通I/O口都支持中断的51单片机@Ai8051U, AiCube 图形化配置
  • 微服务架构的演进:从 Spring Cloud Netflix 到云原生新生态
  • 大模型微调RAG、LORA、强化学习
  • 如何使用VNC对openEuler系统进行远程图形化操作
  • Ubuntu Server 22.04 k8s部署服务较时,文件描述符超过限制的处理方法
  • RabbitMQ:SpringBoot+RabbitMQ 多消费者绑定同一队列
  • Node.js 在 Windows Server 上的离线部署方案
  • leetcode349. 两个数组的交集
  • 轻度娱乐浪潮下定制开发开源AI智能名片S2B2C商城小程序的机遇与策略
  • 厚板数控矫平机的“第三堂课”——把视角拉远,看看它如何重塑整条制造链
  • 供水设备智慧化管理物联网解决方案:远程监控与运维
  • 搭建最新--若依分布式spring cloudv3.6.6 前后端分离项目--步骤与记录常见的坑
  • BKP相关知识点
  • 从机器视觉到图像识别:计算机视觉的多维探索
  • LINUX819 shell:for for,shift ,{} ,array[0] array[s] ,declare -x -a
  • 服务注册与服务发现原理与实现
  • CentOS 8开发测试环境:直接安装还是Docker更优?
  • Docker核心---数据卷(堵门秘籍)
  • 应用控制技术、内容审计技术、AAA服务器技术
  • 深入理解Redis持久化:让你的数据永不丢失
  • 电子电气架构 ---SDV技术基础与传统E/E架构有何不同?
  • 利用图数据库高效解决 Text2sql 任务中表结构复杂时占用过多大模型上下文的问题
  • 智慧养老中IPTV融合对讲:重塑养老沟通新生态
  • t12 low power design: power plan脚本分享(4) power stripe
  • spring声明式事务,finally 中return对事务回滚的影响
  • 数据资产入表——图解《企业数据资源相关会计处理暂行规定》《数据资产评估指导意见》【附全文阅读】
  • 企业架构是什么?解读
  • 功能组状态的独立性以及 进程启动在状态管理中的设计意图