vue的data(data: {})值为null时,模板取{{data.notice}},模板编译报错:Cannot read property ‘notice‘ of null。导致了后续dom显示
问题举例:
// dom1
<div class="box-message">
<div class="box-message-ct">
<div
v-if="data.notice?.length > 30"
class="scrolling-notification"
>
{{ data.notice }}
</div>
<div v-else class="message-text">
{{ data.notice }}
</div>
</div>
</div>
// dom2
<div class="left-position">
<CardTitle title="当前位置"></CardTitle>
<img src="./images/position.png" class="position-img" alt="" />
</div>
为什么会影响class="left-position"元素的显示
问题结果:
- data数据在声明时 data: {}
- data在接收后端数据并赋值时,后端返回的是null;导致data的值变成了null
- 当 data 从对象变为 null 时,Vue 的响应式系统会检测到变化,并触发整个组件重新渲染。如果渲染过程中有计算属性、方法或子组件依赖 data,可能会导致意外的显示问题。
- 如果 data 是 null,而模板里其他地方直接访问 data.xxx 没有用可选链,就会报错:Cannot read property ‘notice’ of null。
这可能导致 Vue 渲染中断,影响后续元素(如 left-position)的显示。
可选链(?):data?.xxx
如何修改:
- 如果是vue3或者vue2.7*,都可以使用可选链(更安全的写法):
{{ data?.notice }}
- 多套一层v-if
<div v-if="data && data.notice">
</div>
- 在js中给data赋值时,添加 ||
this.data = res.data || {}
- 给vue添加全局错误捕获
// 注册全局错误处理捕获错误,但具体有没有用,不太清楚,本人没有用这个方法
// main.js
Vue.config.errorHandler = function (err) {
console.error('Render error:', err)
}
总结:Vue 渲染中断的本质
响应式触发:data = null 触发 dep.notify(),启动重新渲染。
渲染函数报错:未保护的 data.notice 访问抛出错误,中断 _render()。
错误处理边界:Vue 会捕获错误,但可能无法恢复完整的渲染流程。
连锁影响:错误导致后续 VNode 生成失败,无关元素可能未被更新或显示异常。
解决方案:始终对可能为 null 的数据使用防御性访问(可选链、默认值),并保持数据结构稳定。
上一篇: 几秒钟就充满电!科学
下一篇: 暂无数据