这段时间在用 rn 开发一个答题 APP,遇到一个问题折腾我了好长时间了,不得不来求问。
在答题 APP 中,类似于以前用驾照宝典,向左向右划动或者点击下一题 上一题 按钮可以进入下一题上一题 。
因为是初次使用 RN 开发 APP,经验不足,我目前的做法是这样的:
背景介绍:我使用 mobx 来管理 store
一、自已的做法: 从服务器拉取特定数量的题目,保存到 store 中的列表,然后在列表中提取一个题目,在父 View 中进行渲染,此时在 View 中需要根据题目的类型(单选、多选、填空、判断)渲染不同的子组件。当点击下一题上一题时,则相应的在列表中提取题目数据,然后在父 View 中重新渲染对应类型的子组件。
效果是实现了的,但不足之处是似乎不太顺畅,在切换题目时,总感觉有那么点卡,虽然在可以接受的范围内,但还是希望能够改进。
二、比较想要的做法:使用类似于 android 的 viewpager 来实现 目前我找到三个不同的开源组件,分别是:
1 ) https://github.com/race604/react-native-viewpager
2 ) https://github.com/leecade/react-native-swiper
3 ) https://github.com/zbtang/React-Native-ViewPager
但是都有相应的问题存在 , 比如说 race604/react-native-viewpager, 我是根本没成功跑起来,没有正常渲染出组件,而且会有莫名其妙的问题,暂且略过不谈。
再说 zbtang/React-Native-ViewPager,成功达到效果,page 之间切换很顺畅,但却有个问题,比如说,我初始阶段只是拉取了 10 条题目,当浏览到最后一题时,我需要再向服务器拉取更多的题目,
但此时,我在拉取新的题目并且 push 在原列表之后,ViewPager 没有继续动态渲染新拉取的几个题目,我可以看到分页指示器多了几个分页,也可以切换过去相应的页面,但是页面是空的,没有相应的子组件 (不知道只是文字表示大家明不明白我在说什么),参考一下代码吧:
_handlePageChange = (index) =>{
const { questionStore } = this.props
//当当前题目到达临界点时,再次向服务器请求更多的数据
if ( index.position === (questionStore.questions.length - 1)){
this.fetchQuestions()
}
}
render(){
<IndicatorViewPager
style={{height:300}}
indicator={this._renderDotIndicator()}
onPageSelected={ this._handlePageChange }
>
{questions.map((item) => { // questions 来自于 mobx store
return (<View style={styles.slide1} key={item.id}>
<Text style={{fontWeight: 'bold'}}> {item.subject} </Text>
</View>)
})}
</IndicatorViewPager>
}
最后说一下最热门的 leecade/react-native-swiper,很好很顺畅,功能也满足我的需求,但却遇到一个目前无解的 bug ,可以参考这个 issue:https://github.com/leecade/react-native-swiper/issues/233,我也遇到同样的问题,基于此,淘汰掉。
所以最后我想问,使用 rn 来实现 上一题 下一题,有什么优雅高效的方案吗?
顺便吐槽一下隔壁 react china 社区,人气严重不足。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.