关于改变data里面的引用类型数据时不触发updated

258 阅读1分钟

最近遇到一个问题,我在data函数里的引用数据类型数据,我在自己的方法里面去改变该对象的值,没有触发updated函数

data() {
 return {
	option: {
	  color: ["#2086cb"],
	  title: {
	  	text: "加班工时统计",
	  },
	  grid: {
	  	left: "50px",
	  },
	  xAxis: {
	  	type: "value",
	  },
	  yAxis: {
	  	type: "category",
	  	data: [],
	  },
	  series: {
	  	data: [],
	  	type: "bar",
	  },
    },
 };
},
  • 很明显option这个引用数据类型里面有好几层,那么不管是我直接改变option的第几层,都无法触发updated函数。这涉及到变量的基础数据类型和引用数据类型的问题。基础数据类型,如果你给变量赋值,那变量保存的值就是这个值。引用数据类型,保存的这是这个值的内存地址,所以你每次改变对象里面的属性里面的值,但是保存在变量中的内存的地址没有变化,因此不触发updated。那么怎样做可以触发updated函数呢?
//可以直接用Object.assign()来生成一个新对象并替换前面的对象。
Object.assign(
  {},
  {
  	color: ["#2086cb"],
	  title: {
	  	text: "加班工时统计",
	  },
	  grid: {
	  	left: "50px",
	  },
	  xAxis: {
	  	type: "value",
	  },
	  yAxis: {
	  	type: "category",
	  	data: [],
	  },
	  series: {
	  	data: [1,2,3,4,5],
	  	type: "bar",
	  },
  }
)
//但是我这个需要改变的只是这个对象很深的一小部分属性的值,还要复制那么多完全不用改变的值,实在很麻烦。那就使用watch深度监听option,不要用updated了
watch: {
 option: {
  handler(newVal) {
  	if (!this.myChart) {
  	  this.setEchart();
  	}
  	this.chartChange();
  },
  deep: true,
 },