【发布时间】:2019-01-22 22:59:54
【问题描述】:
问题
人们如何实现无限数量的页面让您动态滑动?
详情
如果某个应用在一天内呈现页面,您可以期望在前一天向右滑动,在第二天向左滑动。
向右/向左滑动与按下按钮 5/6 相同。并显示已经渲染的页面。同时,现在相邻日期的新页面也会被渲染。
最初,我认为这是您可以使用轮播来执行的操作,例如使用 react-native-snap-carousel 库。我想像下面的例子,但是使用状态变量而不是图像数组来渲染页面。
所以,如果我想渲染一个顶部带有日期的页面,我将有一个数组作为状态的一部分,例如:
carouselElements: [ '2019/01/21', '2019/01/22', '2019/01/23']
输入下面的轮播,我会返回三页,每页顶部显示日期。
<Carousel
ref={(c) => { this._carousel = c; }}
data={this.props.carouselElements}
renderItem={this.renderDay}
sliderWidth={sliderWidth}
itemWidth={sliderWidth}
enableSnap
firstItem={1}
initialNumToRender={3}
maxToRenderPerBatch={3}
onBeforeSnapToItem={(index) => this.changeEvent(index)}
useScrollView/>
问题 1:无限增长的数组
您可以从Day X 开始,提前两天渲染相邻的时间。
如果我向左滑动,您将访问 Day X+1 和 concat Day X+2 到数组的末尾并渲染当天。
数组变为:
[ 'Day X-1', 'Day X', 'Day X+1', 'Day X+2']
为了提高性能,我可以在 3 天的窗口中继续检查索引,只渲染选定的日期和相邻的两天。但是数组会无限增长,你的代码最多是 O(n)。
问题 2:索引
a) 前置元素:
您可以从Day X 开始,然后向右滑动。您现在正在显示Day X-1。您将Day X-2 添加到数组的开头并渲染它以准备第二次向右滑动。问题是您在索引 0 处添加了一个元素。当索引 0 从 Day X-1 更改为 Day X-2 时,您的系统指向索引 0 的状态,因此页面现在改为显示 Day X-2。
也就是说,不是在您向右滑动时向后移动一天,而是在每次滑动时向后移动 2 天。
b) 移除元素
如果我删除一个元素以保持数组较小,一切都会发生变化,但索引保持不变。索引现在指向与数组中预期元素不同的元素,这会在索引可以更正之前反映在呈现的页面中。
所以我的问题是: 人们如何通过页面滑动实现动态页面渲染广告无限?似乎很多应用都有它,我找不到任何人在谈论它。
编辑
编辑 1:添加了带有相应编辑的图像,以更好地解释我的问题。
编辑 2:我有一个使用 react-native-swiper 的工作实现,它基本上需要一个庞大的数组,并且只呈现紧邻显示页面的一批幻灯片。
<Swiper style={styles.wrapper}
showsButtons={false}
index={currentDateIndex}
loadMinimal={true}
loadMinimalSize={1}
showsPagination={false}
loop={false}
onIndexChanged={(index) => dispatch(changeSelectedDayByIndex(index))}
>
{dates.map((item) =>
this.renderDay(item)
)
}
</Swiper>
但是,dates.map 命令在启动时会造成很大的性能损失。
编辑 3:
在映射之前对日期数组使用slice 命令似乎不是一个选项,因为我将在现有状态转换期间进行渲染..
【问题讨论】:
-
我觉得你可以在服务器端渲染的帮助下做到这一点。
标签: android arrays react-native carousel react-native-android