vue项目tab切换echart图表切换宽度缩小和图表内容不正确解决

代码:

布局:
<TabButton :btnValue1="'总数'" :btnValue2="'明细'" @watchFlag="handler"></TabButton>
	<div class="it_content">
		<div class="picture" id="work" ref="work" v-show="flag===false"></div>
		<div class="picture" id="workTotal" ref="workTotal" v-show="flag===true"></div>
	</div>
处理函数:
handler(flag){
				this.flag=flag;
				if(!this.flag){
			this.$nextTick(() => {
              this.drawwork(); // 明细图
          });
				}else{
			this.$nextTick(() => {
              this.drawworkTotal(); // 总数图
          });
				}
			},

1、解决宽度缩小的问题
本来是用vue指令的v-if,但是发现用v-if出现宽度缩小的问题。后来改用v-show。这是因为v-if指令是将Dom元素去除掉位置空间了,v-show是将Dom元素位置空间保留了,但并没有进行渲染。v-show保留所定义的样式,空间位置也被保留,echarts图表的宽高依旧和之前一样,所以不会缩小。
2、图表内容不正确
利用this.$nextTick(() => {})。Vue 实现响应式并不是数据发生变化之后 DOM 立即变化,而是按一定的策略进行 DOM 的更新。 $nextTick 是在下次 DOM 更新循环结束之后执行延迟回调,在修改数据之后使用 $nextTick,则可以在回调中获取更新后的 DOM。flag发生变化之后,Dom没有立即更新了,通过 $nextTick 回调函数,执行echarts的绘画。
nextTick的由来:
  由于VUE的数据驱动视图更新,是异步的,即修改数据的当下,视图不会立刻更新,而是等同一事件循环中的所有数据变化完成之后,再统一进行视图更新。
nextTick的触发时机:
  在同一事件循环中的数据变化后,DOM完成更新,立即执行nextTick(callback)内的回调。
结合nextTick的由来,可以推出每个事件循环中,nextTick触发的时机:
  同一事件循环中的代码执行完毕 -> DOM 更新 -> nextTick callback触发
应用场景:
  需要在视图更新之后,基于新的视图进行操作。

猜你喜欢

转载自blog.csdn.net/Miss_hhl/article/details/104038512