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 相关文章推荐
使用jquery给input和textarea设定ie中的focus
May 29 Javascript
很棒的学习jQuery的12个网站推荐
Apr 28 Javascript
jQuery动态地获取系统时间实现代码
May 24 Javascript
angularJS结合canvas画图例子
Feb 09 Javascript
jQuery实现首页顶部可伸缩广告特效代码
Apr 15 Javascript
用JS生成UUID的方法实例
Mar 30 Javascript
js 实现省市区三级联动菜单效果
Feb 20 Javascript
JS实现div模块的截图并下载功能
Oct 17 Javascript
详解vue-cli 接口代理配置
Dec 13 Javascript
vue2.0模拟锚点的实例
Mar 14 Javascript
JS中min函数实例讲解
Feb 18 Javascript
浅谈vue 二级路由嵌套和二级路由高亮问题
Aug 06 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添加文章时生成静态HTML文章的实现代码
2013/02/17 PHP
CodeIgniter CLI模式简介
2014/06/17 PHP
php通过array_merge()函数合并两个数组的方法
2015/03/18 PHP
PHP ADODB生成HTML表格函数rs2html功能【附错误处理函数用法】
2018/05/29 PHP
浅谈Javascript面向对象编程
2011/11/15 Javascript
jQuery客户端分页实例代码
2013/11/18 Javascript
JQuery表单验证插件EasyValidator用法分析
2014/11/15 Javascript
javascript数组遍历for与for in区别详解
2014/12/04 Javascript
js实现鼠标感应向下滑动隐藏菜单的方法
2015/02/20 Javascript
jquery实现仿新浪微博评论滚动效果
2015/08/06 Javascript
js创建jsonArray传输至后台及后台全面解析
2016/04/11 Javascript
AngularJS动态绑定HTML的方法分析
2016/11/07 Javascript
适用于手机端的jQuery图片滑块动画
2016/12/09 Javascript
原生JS轮播图插件
2017/02/09 Javascript
js + css实现标签内容切换功能(实例讲解)
2017/10/09 Javascript
React Native时间转换格式工具类分享
2017/10/24 Javascript
AngularJS与后端php的数据交互方法
2018/08/13 Javascript
vue拖拽组件使用方法详解
2018/12/01 Javascript
用Golang运行JavaScript的实现示例
2019/11/25 Javascript
[07:40]DOTA2每周TOP10 精彩击杀集锦vol.4
2014/06/25 DOTA
使用Python实现一个简单的项目监控
2015/03/31 Python
Django中模型Model添加JSON类型字段的方法
2015/06/17 Python
Python简单连接MongoDB数据库的方法
2016/03/15 Python
python中的tcp示例详解
2018/12/09 Python
python提取具有某种特定字符串的行数据方法
2018/12/11 Python
Python学习笔记之函数的定义和作用域实例详解
2019/08/13 Python
关于阿里云oss获取sts凭证 app直传 python的实例
2019/08/20 Python
Python使用Turtle库绘制一棵西兰花
2019/11/23 Python
css3动画事件—webkitAnimationEnd与计时器time事件
2013/01/31 HTML / CSS
乡镇纠风工作实施方案
2014/03/22 职场文书
二人合伙经营协议书
2014/09/13 职场文书
市委召开党的群众路线教育实践活动总结大会报告
2014/10/21 职场文书
商务代表岗位职责
2015/02/15 职场文书
2015年乡镇卫生院工作总结
2015/04/22 职场文书
大学生先进个人主要事迹材料
2015/11/04 职场文书
Python中tqdm的使用和例子
2022/09/23 Python