react-native动态切换tab组件的方法


Posted in Javascript onJuly 07, 2018

在APP中免不了要使用tab组件,有的是tab切换,也有的是tab分类切换.

这些组件分成下面两种.

react-native动态切换tab组件的方法
react-native动态切换tab组件的方法

第一种非常简单,同时大多数第三方组件都能达到效果.这里重点讲述第二种,我们要让第二种组件不仅能左右滑动,同时还能够在点击的时候自动滑动,将点击的位置滑动到正中间.

准备

我们先来分析一波.一个滑动组件在APP上是一种什么状态.

react-native动态切换tab组件的方法

这里可以看出,tab组件需要考虑到长度超过APP的屏幕,并且在超过之后能够滑动.

同时计算出当前位置需要滑动多少距离才能够将位置居中.
需要滑动的位置=点击位置的左边距-APP屏幕/2+点击位置的宽度/2

这个公式也就是我们自动滑动的核心了.

开发

使用ScrollView组件承载tab项,这样就可以非常简单的达到滑动的效果.同时添加horizontaldirectionalLockEnabledshowsHorizontalScrollIndicatorsnapToAlignment几个属性.

<ScrollView ref={e => this.scroll = e}
 horizontal directionalLockEnabled
 showsHorizontalScrollIndicator={false}
 snapToAlignment="center">
 {this.props.data.map((item, index) =>
  {/*具体项*/}
 )}
</ScrollView>

使用TouchableOpacity包裹内容项,同时调用setLaout方法将每个项的宽高等属性记录下来,为我们后面计算当前位置做准备.

<TouchableOpacity onPress={() => this.setIndex(index)} 
 onLayout={e => this.setLaout(e.nativeEvent.layout, index)} 
 key={item.id} 
 style={tabBarStyle.itemBtn}>
  <Text style={[tabBarStyle.item, this.state.index === index ? tabBarStyle.active : null]} > {item.name}</Text>
  <View style={[tabBarStyle.line, this.state.index === index ? tabBarStyle.active2 : null]}>    </View>
</TouchableOpacity>

记录每个项渲染之后的位置,将这些值存在变量里,为后面计算做准备.

laout_list = []
setLaout(layout, index) {
 //存单个项的位置
 this.laout_list[index] = layout;
 //计算所有项的总长度
 this.scrollW += layout.width;
}

接下来就是点击自动变换位置的计算了.

setIndex(index, bl = true) {
 //先改变点击项的颜色
 this.setState({ index })
 //兼容错误
 if (!this.scroll) return;
 //拿到当前项的位置数据
 let layout = this.laout_list[index];
 let rx = deviceWidth / 2;
 //公式
 let sx = layout.x - rx + layout.width / 2;
 //如果还不需要移动,原地待着
 if (sx < 0) sx = 0;
 //移动位置
 sx < this.scrollW - deviceWidth && this.scroll.scrollTo({ x: sx, animated: bl });
 //结尾部分直接移动到底
 sx >= this.scrollW - deviceWidth && this.scroll.scrollToEnd({ animated: bl });
 //触发一些需要的外部事件
 this.props.onChange && this.props.onChange(index);
}

gitee地址

github地址

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
教你如何解密js/vbs/vbscript加密的编码异处理小结
Jun 25 Javascript
扩展easyui.datagrid,添加数据loading遮罩效果代码
Nov 02 Javascript
node.js正则表达式获取网页中所有链接的代码实例
Jun 03 Javascript
JavaScript删除指定子元素代码实例
Jan 13 Javascript
jQuery实现的支持IE的html滑动条
Mar 16 Javascript
javascript 常见功能汇总
Jun 11 Javascript
把多个JavaScript函数绑定到onload事件处理函数上的方法
Sep 04 Javascript
angular.js之路由的选择方法
Sep 24 Javascript
轻松理解Javascript变量的相关问题
Jan 20 Javascript
解决vue的变量在settimeout内部效果失效的问题
Aug 30 Javascript
jquery+css实现Tab栏切换的代码实例
May 14 jQuery
Vue Element plus使用方法梳理
Dec 24 Vue.js
vue.js 实现点击展开收起动画效果
Jul 07 #Javascript
微信小程序实现聊天对话(文本、图片)功能
Jul 06 #Javascript
微信小程序使用wxParse解析html的方法教程
Jul 06 #Javascript
小程序实现发表评论功能
Jul 06 #Javascript
vue中倒计时组件的实例代码
Jul 06 #Javascript
微信小程序websocket实现聊天功能
Mar 30 #Javascript
vue中锚点的三种方法
Jul 06 #Javascript
You might like
77A一级收信机修理记
2021/03/02 无线电
php strtotime 函数UNIX时间戳
2009/01/14 PHP
使用php发送有附件的电子邮件-(PHPMailer使用的实例分析)
2013/04/26 PHP
PHP自带ZIP压缩、解压缩类ZipArchiv使用指南
2015/03/03 PHP
PHP类型约束用法示例
2016/09/28 PHP
js制作的鼠标悬浮时产生的下拉框效果
2012/10/27 Javascript
Jquery动态替换div内容及动态展示的方法
2015/01/23 Javascript
JavaScript中innerHTML,innerText,outerHTML的用法及区别
2015/09/01 Javascript
AngularJS中如何使用$http对MongoLab数据表进行增删改查
2016/01/23 Javascript
JavaScript 2048 游戏实例代码(简单易懂)
2016/03/25 Javascript
js中获取 table节点各tr及td的内容简单实例
2016/10/14 Javascript
vue.js父子组件通信动态绑定的实例
2018/09/28 Javascript
react-router 路由切换动画的实现示例
2018/12/03 Javascript
Vue开发环境中修改端口号的实现方法
2019/08/15 Javascript
JavaScript前端实现压缩图片功能
2020/03/06 Javascript
jQuery实现放大镜案例
2020/10/19 jQuery
python在windows下创建隐藏窗口子进程的方法
2015/06/04 Python
Pycharm学习教程(4) Python解释器的相关配置
2017/05/03 Python
Django自定义认证方式用法示例
2017/06/23 Python
python处理按钮消息的实例详解
2017/07/11 Python
Python模块结构与布局操作方法实例分析
2017/07/24 Python
python导入csv文件出现SyntaxError问题分析
2017/12/15 Python
python写日志文件操作类与应用示例
2019/07/01 Python
python实现将两个文件夹合并至另一个文件夹(制作数据集)
2020/04/03 Python
Lookfantastic西班牙官网:英国知名美妆购物网站
2018/06/13 全球购物
美国在线肉类和海鲜配送:Crowd Cow
2020/10/02 全球购物
linux面试题参考答案(8)
2016/04/19 面试题
电焊工岗位职责
2014/03/06 职场文书
学徒工职责
2014/03/06 职场文书
《三个小伙伴》教学反思
2014/04/11 职场文书
活动总结模板
2014/05/09 职场文书
应届毕业生求职信范文
2014/07/07 职场文书
大学生操行评语大全
2014/12/31 职场文书
经济纠纷起诉状
2015/05/20 职场文书
商业计划书范文
2019/04/24 职场文书
基于python的matplotlib制作双Y轴图
2021/04/20 Python