我遇到一个问题,做一个监控平台,采用轮询请求更新 data,但是由于相关联的视图试用 vfor 渲染的,更新视图时会导致闪烁更新,搜过狗哥也没解决方案,还请大佬们指点一下
|
jorneyrJul 5, 2019
1
试试 throttle 或者 debounce 进行节流,避免频繁更新,可以使用 underscore 或者 lodash 的实现,也可以自己实现这 2 个函数,参考 https://underscorejs.org/#throttle
|
|
NaVientJul 5, 2019
2
是你想的太复杂了把,这不就是更新数据先声明成临时变量,再循环去看页面数据和更新数据不同的地方,更新数据变更的项不就行了吗?
|
|
clandyukiJul 5, 2019
3
加上 key
|
|
15651980765Jul 5, 2019
6
v-for 的时候绑定 key,值用数据的 id,不要用遍历的索引,这样可以保证数据变化后可以最大程度复用之前的 DOM。
|
|
shenyu1996Jul 5, 2019
8
是不是 data 更新前顺便赋了个 null
|
|
TrickWuJul 5, 2019
9
照理不会闪烁的,是根据 data 变化来触发视图更新,应该是你代码写的有问题
|
|
VegetableJul 5, 2019
10
上代码吧兄弟
|
|
cuzfinalJul 5, 2019
11
这种引发列表重新渲染的肯定是用了不稳定 key,代码都不用看。
|
|
no1xsyzyJul 5, 2019
12
先复制一份然后尽可能缩,产生一份最小可复现样本。
如果如 #8 所言,或者类似地更新操作导致 data 暂时地不可用化,应该会在 console 里有报错,或者有 v-if="data"。 另外闪烁的样子录个 gif 吧,有可能甚至跟前端无关,是硬件跟不上也有可能。 |
|
qiaobeierJul 5, 2019
13
尝试闪烁的节点上加上 css 属性 transform: translateZ(0);
|
|
p8YFk4f3E8SJ3aEvJul 5, 2019
14
我的 key 都是 item.index,而且很少使用
|
|
15
代码那点破事真不是难事,码农更重要的是学会沟通,不要抱怨没人回答你的问题,
首先需要学会如何提问,其他人才能更好的理解你的问题。 如何有效地提问: - 你做了什么,怎么做的 - 你查过什么资料,怎么说的 - 你是怎么设计的 - 贴出你的代码 - 编译错误是什么 - 代码截图,错误截图 - 结果有什么错,你期望的结果是什么 - 你是怎么想的 回答你的问题是情义,不理你是我的权力,没有人有义务要帮助你 你是在寻求帮助,态度好点,但也不要委屈自己 最后,如果你啥都不会,或者只会一点基础,不要期望我们告诉你怎么做 |
|
sugarsJul 5, 2019
16
楼上正解,就提问者提供的信息,不够详情,无从下手(就这情况,更新时加了动画 css 也不是不可能)
|
|
a852695Jul 5, 2019
17
能否贴个 GIF 和对应的部分代码,这样问题也好定位
|
|
18
不知道 V2EX 怎么上图。。。
|
|
19
我现在把这边的 key 改成了 index 了,依然会导致闪烁 Orz
https://s2.ax1x.com/2019/07/05/ZawEy4.png |
|
21
@shenyu1996 data 更新前没有做赋值操作,初始渲染的时候是为空的不用管
|
|
22
|
|
ytxbnahnJul 5, 2019
23
更新数据时 你是不是先初始化了 data=[] 然后在重新赋值.@SanGo
|
|
wdsproJul 5, 2019
25
@SanGo 楼上整理了三种可能
一个是你的 key 尽量不要用 index 用用其他的 ID 啥的 尽量减少重绘 二就是你取回新的 data 前是不是有初始化数组为[] 肯定就又完完整整重新渲染了两次 会闪烁 第三种就是有可能硬件有影响 数据量太大的时候 排除方式是最小化自己的数据量来例化测一下 楼上说的 transfromZ 也有可能 别着急问 先看看大家的回答 这么多楼了 你的 key 还没改试一下 |
|
wdsproJul 5, 2019
26
你的图里 第二个 for 循环里怎么有两个:key
|
|
no1xsyzyJul 5, 2019
27
|
|
28
|
|
ASpiralJul 5, 2019
29
点开第一张图就看到 :key="item.CtiNo + i",key 不要用到 index …
|
|
30
@jorneyr 设计和效果都上了附图了,附 1 是代码,附 2 和#22 是效果,
搜索过 data 更新闪烁,大多数都是说采用 v-cloak 来解决,但是我这里不是初始化的空白闪烁问题,是更新数据的异步闪烁 Orz,期望#22 的数据更新时不发生闪烁,该代码目标是实现监控组通话数量(数量还没绑定进去渲染),谢谢 |
|
31
|
|
no1xsyzyJul 5, 2019
32
res.Cti 的值是?
你还说没有先清空再添加? |
|
34
你用了两个接口去获取
一个 getCti 一个 getTrunk 你先把 getCti 的结果填充进去,然后再去获取的 getTrunk 我有理由相信 getCti 本身没有 Trunk 的信息,所以 Trunk 被清空了,然后又通过 watch 添加的,中间必然差至少一帧。 |
|
no1xsyzyJul 5, 2019
35
这个问题不管是开 vue debugger (浏览器插件)还是开 Network 选项卡都是可以轻易得知的。
|
|
jorneyrJul 5, 2019
36
看不出问题来,如果可能的话, 弄一个最小的测试案例,大家可以重现,然后才能去调试。
数据模拟生成就好,不用走服务器端 |
|
lhstockJul 5, 2019
39
watch 监听 CTI 又修改 CTI 是作死
|
|
catoncatJul 5, 2019
41
|
|
liuy1994gJul 5, 2019 via Android
42
求求你打开控制台看看 network 到底发了多少个请求吧。
你在 watch 里面对每一项都重新取值了。 |
|
catoncatJul 5, 2019
44
你可以不用 watch,第一级拿完直接拿第二级返回完整数据不就得了。我看你都不关心 id 是不是变了,每次都是拿的全量新数据。那就直接都拿完拼完呗。
|
|
45
@SanGo 还有一种就是把 CTI 和 Trunk 分开存两个属性里,分别更新。
但那样其实就是自己手工写一个简陋、粗糙、残缺、低效的关系型数据库。 为什么不让后端做?一件事多个接口还不是做成 RESTful 的。 graphQL 或者 RESTful 你总得选一个。 |
|
a4854857Jul 5, 2019
47
看了楼上的你的渲染数据如果是两个接口的数据拼成的. 你用 promise.all 保证一次两个请求都返回值了再更新数据不就好了..
|