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 

如何修改:

  1. 如果是vue3或者vue2.7*,都可以使用可选链(更安全的写法):
{{ data?.notice  }}
  1. 多套一层v-if
<div v-if="data && data.notice">
</div>	
  1. 在js中给data赋值时,添加 ||
this.data = res.data || {}
  1. 给vue添加全局错误捕获
// 注册全局错误处理捕获错误,但具体有没有用,不太清楚,本人没有用这个方法
// main.js
Vue.config.errorHandler = function (err) {
	console.error('Render error:', err)
}

总结:Vue 渲染中断的本质

响应式触发:data = null 触发 dep.notify(),启动重新渲染。

渲染函数报错:未保护的 data.notice 访问抛出错误,中断 _render()。

错误处理边界:Vue 会捕获错误,但可能无法恢复完整的渲染流程。

连锁影响:错误导致后续 VNode 生成失败,无关元素可能未被更新或显示异常。

解决方案:始终对可能为 null 的数据使用防御性访问(可选链、默认值),并保持数据结构稳定。