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 相关文章推荐
判断iframe是否加载完成的完美方法
Jan 07 Javascript
Javascript倒计时代码
Aug 12 Javascript
Jvascript学习实践案例(开发常用)
Jun 25 Javascript
javascript分页代码(当前页码居中)
Sep 20 Javascript
浅析JS刷新框架中的其他页面 &amp;&amp; JS刷新窗口方法汇总
Jul 08 Javascript
jquery中prop()方法和attr()方法的区别浅析
Sep 06 Javascript
jquery对ajax的支持介绍
Dec 10 Javascript
jquery 使用简明教程
Mar 05 Javascript
关于事件mouseover ,mouseout ,mouseenter,mouseleave的区别
Oct 12 Javascript
最实用的jQuery分页插件
Oct 09 Javascript
vue通过style或者class改变样式的实例代码
Oct 30 Javascript
JQuery获得内容和属性方法解析
May 30 jQuery
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
mysql 性能的检查和优化方法
2009/06/21 PHP
PHP计算2点经纬度之间的距离代码
2013/08/12 PHP
PHP 序列化和反序列化函数实例详解
2020/07/18 PHP
laravel5.6中的外键约束示例
2019/10/23 PHP
文本框的字数限制功能jquery插件
2009/11/24 Javascript
Javascript的数组与字典用法与遍历对象的属性技巧
2012/11/07 Javascript
js 实现菜单上下显示附效果图
2013/11/21 Javascript
js打造数组转json函数
2015/01/14 Javascript
C#中使用迭代器处理等待任务
2015/07/13 Javascript
JavaScript实现简单Tip提示框效果
2016/04/20 Javascript
所见即所得的富文本编辑器bootstrap-wysiwyg使用方法详解
2016/05/27 Javascript
js实现一个可以兼容PC端和移动端的div拖动效果实例
2016/12/09 Javascript
jQuery实现限制文本框的输入长度
2017/01/11 Javascript
Node.js环境下Koa2添加travis ci持续集成工具的方法
2017/06/19 Javascript
php register_shutdown_function函数详解
2017/07/23 Javascript
浅谈node中的exports与module.exports的关系
2017/08/01 Javascript
jQuery实现表单动态加减、ajax表单提交功能
2018/06/08 jQuery
vue+express 构建后台管理系统的示例代码
2018/07/19 Javascript
vue中使用WX-JSSDK的两种方法(推荐)
2020/01/18 Javascript
JavaScript对象原型链原理解析
2020/01/22 Javascript
Python中交换两个元素的实现方法
2018/06/29 Python
TensorFlow 合并/连接数组的方法
2018/07/27 Python
Python 中的lambda函数介绍
2018/10/10 Python
运用PyTorch动手搭建一个共享单车预测器
2019/08/06 Python
在keras中实现查看其训练loss值
2020/06/16 Python
python 调用Google翻译接口的方法
2020/12/09 Python
Alpine安装Python3依赖出现的问题及解决方法
2020/12/25 Python
Abe’s of Maine:自1979以来销售相机和电子产品
2016/11/21 全球购物
法学个人求职信范文
2014/01/27 职场文书
美容院合作经营协议书
2014/10/10 职场文书
2015年会计年终工作总结
2015/05/26 职场文书
2015秋季开学典礼主持词
2015/07/16 职场文书
感谢信
2019/04/11 职场文书
JS继承最简单的理解方式
2021/03/31 Javascript
python3使用diagrams绘制架构图的步骤
2021/04/08 Python
Java中try catch处理异常示例
2021/12/06 Java/Android