【DataV+Vue】解决从后端获取数据后更新data不生效问题

646 阅读2分钟

背景:笔者最近在依托Vue框架和可视化组件库DataV在实现简单的数据大屏,尝试从后端获取数据并渲染到页面上,如下图:

image.png 可以看到,需要从后端获取数据并渲染,采用数组/对象序列作为data将会更方便,

下面主要以DataV中数字翻牌器为例,解决从后端获取数据后渲染不生效的情况

ps:笔者是小白,有时候往往不求甚解,有不当之处望批评指正啦!~

一、错误案例

924803ec62a1fa230d11457fd55e2a6.png

封装axios后调用api获取记录总数,并将getData挂载在mounted中。

此时,在函数内部打印的sumRecords,确实为176700,但无论是在mounted中调用getData后打印,还是直接在getData中(getSumRecords外)打印this.sunRecords始终是0...

二、原因分析

由于js的限制,Vue不能检测以下出现变动的数组

①直接利用索引值赋值,如this.dataList[index] = newValue(上述错误应该就是因为这个T T

②修改数组长度,如this.dataList.length = newLength

详解参考:(blog.csdn.net/qq_35713752…)

补充: data中数据格式如下 image.png

三、解决方案

其实,DataV官方给出了修改数据的模板,对应于详解中的方法二——重写数组里的整个对象,但是实际并非直接全部属性给他再写一遍(费劲得很!),利用扩展符...来解决即可。

解决步骤如下:

(1)修改数据,对应赋值即可,如this.config.data = response.data.list

(2)重写对象,this.config(新的) = { ...this.config(原来的) }

改造后对应代码如下:

getSumRecords().then(resp => {
  // 先改变数据
  this.digitalFlopData[0].config.number[0] = resp.data
  // 再统一重写对应的对象,this.config = { ...this.config }
  this.digitalFlopData[0].config = { ...this.digitalFlopData[0].config }
})

二者缺一不可!!!

补充: 注意number和content有具体类型要求,附上官网原图👇

image.png 并且注意: number中的元素将被用于替换content内容模版中的{nt}标记,其替换顺序与模版标记的顺序一一对应:

const number = [1, 2, 3, 4]
const content = '数字{nt},数字{nt},数字{nt},数字{nt}'
// 实际显示效果:'数字1,数字2,数字3,数字4'

所以不能自己改成数字/字符串喇~