vue长列表溢出隐藏的dom不渲染,出现在视图窗口才渲染;
手动封装了个表格 手动添加了单选复选勾选图片,for循环出来很多数据;动态修改每条数据的isChecked字段判断是否勾选,
问题1:当我勾选了某条数据时,拖动滚动条后,勾选的数据滚动到视图外,再次滚动回来时之前的那条数据出现了自动重新勾选的动作
问题2:初步判断是因为溢出隐藏的元素可能不会被渲染,初始值没有勾选,再次回到视图时首先根据初始值进行了渲染,然后又根据我改变值的状态再次进行了渲染,所以视觉上出现了自动勾上的动作。
寻求解决办法——
问题1:在渲染数据时使用 "key" 属性来标识每一条数据,这样 Vue 就能够识别哪些元素是新渲染的,哪些元素是已存在的。这样可以避免重新渲染已经存在的元素,从而解决了问题1。
问题2:我们可以在修改每条数据的isChecked字段时,使用 Vue.set() 或者 this.$set() 方法来修改,这样 Vue 就能够知道该字段被修改了,并进行重新渲染,而不是在视图窗口内重新渲染时去重新赋值。
解决方案1: 使用虚拟列表,只渲染当前在视图窗口中可见的元素,而不是渲染整个列表。
解决方案2: 使用 Vue 的 v-if 指令,来动态地渲染元素,当元素出现在视图窗口中时才渲染。
解决方案3: 使用 Vue 的缓存机制,在组件中使用 keep-alive 指令,在组件离开视图窗口时缓存组件的状态,当组件重新进入视图窗口时,恢复缓存的状态。
解决方案4: 利用Vuex来管理状态,将勾选状态统一管理,使用统一的状态管理来解决状态的一致性。