关于 Taro 的 ScrollView 在Dom结构发生变化会自动回滚到顶部解决方案和原因
使用Taro开发小程序时候发现 ScrollView 会在同级节点发生增删情况下会自动会滚ScrollView到顶部,经过多次验证和查阅Taro原理发现这是Taro自身bug
出现回滚顶部bug的演示代码
下面有一个列表和按钮,点击按钮会出现加载更多的字样。但是当我们点击按钮时候,ScrollView就会惊奇发生会滚到顶部的现象。
const App: React.FC = () => {const [show, setShow] = useState<boolean>(false)const list = new Array(1000)const onClick = (): void => setShow(true)return (<View><View onClick={onClick} >按钮</View><ScrollView>{list.map(_, index) => (<View key={index}>{index}</View>)}</ScrollView>{show && <View>加载更多</View>}</View>)
}
出现BUG原因
因为Taro其实是将React所有组件的state更新归级Page统一进行管理即楼级组件对应的state是
// 初始化state
state = {Page: [ View, ScrollView ]
}
那么新增和删除节点就是
const oldPage = this.state.Page
this.setState({ Page: [ ...oldPage, View ]
})
这样微信进行diff时候认为是一个全新的数组,这样整个楼级组件都会重新创建。所以ScrollView会被重新创建,就会出现ScrollView自动会滚顶部的情况。
解决方案
- 避免同级节点操作,这个几乎很难。所以抛弃
- 使用 Block 组件包裹ScrollView的同级节点,那么我们更新节点时候就是单独对数组某个元素更新。这样就不会影响到ScrollView元素。
当我们用Block包裹 加载更多
发生更新的行为将是这样,那么在微信小程序diff对比时候只是楼层数组里面某个元素内容发生变化,就不会对ScrollView节点进行重建
const oldPage = this.state.Page
oldPage[2] = [ View ]
this.setState({ Page: oldPage })
解决bug代码
const App: React.FC = () => {const [show, setShow] = useState<boolean>(false)const list = new Array(1000)const onClick = (): void => setShow(true)return (<View><View onClick={onClick} >按钮</View><ScrollView>{list.map(_, index) => (<View key={index}>{index}</View>)}</ScrollView><Block>{show && <View>加载更多</View>}</Block></View>)
}
关于 Taro 的 ScrollView 在Dom结构发生变化会自动回滚到顶部解决方案和原因相关推荐
- javascript遍历DOM结构和对象结构
在实际工作中,记住浏览器中对象的属性.方法几乎是件不可能完成的任务,保持一份资料或网址是个好办法.但是查阅资料也是要花费不少时间,如果能有个脚本将对象的结构打印出来,将会加速开发进程. 下面是我编写的 ...
- jQuery EasyUI Datagrid组件的完整的基础DOM结构
标题可能有点长,什么叫"完整的基础DOM结构",这里"基础"的意思是指这个结构不依赖具体数据,不依赖Datagrid的view属性,只要存在Datagrid实例 ...
- jsplumb dom 位置发生变化,连线错位
4.jsplumb 在 dom 位置发生变化 jsplumb 监听不到,所以连线位置不对. 场景:点击按钮查找parent 的关系,展示parent,相反查找 children, 但是按钮盒子的位置变 ...
- javascript --- 将DOM结构转换成虚拟DOM 虚拟DOM转换成真实的DOM结构
虚拟DOM的实现 使用虚拟DOM的原因: 减少回流与重绘 将DOM结构转换成对象保存到内存中 <img /> => { tag: 'img'} 文本节点 => { tag: u ...
- DOM-3 【utils/待讲评】节点属性、方法、封装方法、DOM结构
讲评 节点属性 nodeType 元素节点 1 大写 属性节点 2 文本节点 3 #text 注释节点 8 #comment document 9 DocumentFragment 11 nodeNa ...
- datagrid 完整dom结构
<!-- datagrid的最外层容器,可以使用$(target).datagrid('getPanel')或者$.data(target,'datagrid').panel得到这个DOM对象, ...
- 提高测试脚本复用性降低DOM结构引起路径变化的影响
问题描述 在定位元素时直接复制的xpath. 但是因为下面这些原因导致之前引用的路径失效, 不得不频繁修改脚本重新定位元素, 大降低了脚本的复用性, 也增加了维护的成本: 1. UI修改 (比如增加了 ...
- 简单认识JavaScript 与 DOM结构的文本、标签和属性节点
一 JavaScript JavaScript 是属于网络的脚本语言!被数百万计的网页用来改进设计.验证表单.检测浏览器.创建cookies,以及更多的应用.JavaScript 是因特网上最流行的脚 ...
- SpringMVC--Ajax异步加载数据$(function (){ 逻辑代码}) 的意思是让dom结构加载完毕后再去执行逻辑代码
1. SpringMVC–Ajax异步加载数据 1.1 实体类user User.java package com.tian.pojo;import lombok.AllArgsConstructor ...
最新文章
- apppath php,App.php
- mysql 应用前景_图数据库在企业应用中前景如何,相比关系型数据库有哪些优势?...
- R语言使用ggplot2包使用geom_dotplot函数绘制分组点图(双分类变量分组可视化)实战(dot plot)
- Python实现查询12306火车票信息
- Python与开源GIS:在OGR中使用SQL语句进行查询
- 工业机器人第三版答案韩建海_工业机器人技术(第三版)课后答案 郭洪红主编
- GitHub:Octotree与GitHub1s插件的介绍与使用
- 项目管理手记(七)--DRP系统的文化输出与营销
- 分子量-算法竞赛习题3-2:给出一种物质的分子式(不带括号),求分子量。本题中的分子式只包含4种原子,分别为C, H, O, N,原子量分别为12.01, 1.008, 16.00, 14.01。
- 多示例论文泛读:Revisiting Multiple Instance Neural Networks (2016 mi-Net MI-Net)
- cpp头文件方法大全
- oracle数据库lpad,Oracle的lpad与rpad函数的应用
- 签名档php,签名档文字
- 用R语言对网络数据进行统计分析(四)
- 4K分辨率火狐浏览器宋体过细解决方法
- AndroidManifest merger failed with multiple errors, see logs
- Nginx基础应用——日志切割
- mac单节点安装Erda实践
- 使用PPT将图片背景透明化
- ArcGIS中的土地利用变化分析
热门文章
- 刘卫国python实验答案_MATLAB(刘卫国)部分实验答案
- docker 删除image_如何用两个小时入门 Docker?
- mysql_num_rows+报错_错误:警告:mysql_num_rows()期望参数1为资源,在第19行的C:\ xampp...
- c语言课设报告时钟vc环境,C语言课程设计报告模拟时钟转动程序.doc
- 服务器将office转pdf文件,Windows服务-Office转PDF文件
- 如何关闭Win11系统更新
- Win11没有操作中心怎么办 Win11没有操作中心的解决方法
- jeecg t:datagrid标签 每页显示条数 扩展
- linux 历史命令快捷键,Linux历史命令及bash快捷键
- 操作痕迹包括那些_高级消防设施操作员专题之:走近气体灭火系统