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 相关文章推荐
(转载)JavaScript中匿名函数,函数直接量和闭包
May 08 Javascript
深入理解JavaScript系列(3) 全面解析Module模式
Jan 15 Javascript
javascript parseInt() 函数的进制转换注意细节
Jan 08 Javascript
js操作checkbox遇到的问题解决
Jun 29 Javascript
利用JavaScript阻止表单提交的两种方法
Aug 11 Javascript
javascript实现将数字转成千分位的方法小结【5种方式】
Dec 11 Javascript
jQuery监听浏览器窗口大小的变化实例
Feb 07 Javascript
JS中使用cavas截图网页并解决跨域及模糊问题
Nov 13 Javascript
JavaScript之实现一个简单的Vue示例
Jan 17 Javascript
详解VUE项目中安装和使用vant组件
Apr 28 Javascript
怎么使用javascript深度拷贝一个数组
Jun 06 Javascript
JS实现扫码枪扫描二维码功能
Jan 03 Javascript
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
php数组添加与删除单元的常用函数实例分析
2015/02/16 PHP
PHP下 Mongodb 连接远程数据库的实例代码
2017/08/30 PHP
Laravel框架实现的上传图片到七牛功能详解
2019/09/06 PHP
tp5框架前台无限极导航菜单类实现方法分析
2020/03/29 PHP
javascript Xml增删改查(IE下)操作实现代码
2009/01/30 Javascript
javascript &amp;&amp;和||运算法的另类使用技巧
2009/11/28 Javascript
Jquery Ajax请求代码(2)
2011/01/07 Javascript
30个让人兴奋的视差滚动(Parallax Scrolling)效果网站
2012/03/04 Javascript
解决遍历时Array.indexOf产生的性能问题
2012/07/03 Javascript
使用JavaScript 实现各种跨域的方法
2013/05/08 Javascript
ExtJs纵坐标值重复问题的解决方法
2014/02/27 Javascript
JavaScript中window.showModalDialog()用法详解
2014/12/18 Javascript
jquery文字填写自动高度的实现方法
2016/11/07 Javascript
jquery表单插件form使用方法详解
2017/01/20 Javascript
jQuery插件FusionCharts绘制2D双折线图效果示例【附demo源码】
2017/04/14 jQuery
React Native使用Modal自定义分享界面的示例代码
2017/10/31 Javascript
怎么使用javascript深度拷贝一个数组
2019/06/06 Javascript
Node.js系列之发起get/post请求(2)
2019/08/30 Javascript
微信小程序仿抖音短视频切换效果的实例代码
2020/06/24 Javascript
详解Vue.js 响应接口
2020/07/04 Javascript
如何搭建一个完整的Vue3.0+ts的项目步骤
2020/10/18 Javascript
初步介绍Python中的pydoc模块和distutils模块
2015/04/13 Python
python 类详解及简单实例
2017/03/24 Python
Python3多进程 multiprocessing 模块实例详解
2018/06/11 Python
python中partial()基础用法说明
2018/12/30 Python
在PyCharm下使用 ipython 交互式编程的方法
2019/01/17 Python
详解Python的爬虫框架 Scrapy
2020/08/03 Python
HTML5单页面手势滑屏切换原理
2016/03/21 HTML / CSS
英国创新设计文具、卡片和礼品包装网站:Paperchase
2018/07/14 全球购物
.NET面试题:什么是反射
2016/09/30 面试题
如何通过jdbc调用存储过程
2012/04/19 面试题
三项教育活动实施方案
2014/03/30 职场文书
小学感恩节活动策划方案
2014/10/06 职场文书
检讨书格式
2015/01/23 职场文书
2015年小学一年级班主任工作总结
2015/05/21 职场文书
英语投诉信范文
2015/07/03 职场文书