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 相关文章推荐
JSON 学习之JSON in JavaScript详细使用说明
Feb 23 Javascript
两个JavaScript jsFiddle JSBin在线调试器
Mar 14 Javascript
一次失败的jQuery优化尝试小结
Feb 06 Javascript
JavaScript Sort 的一个错误用法示例
Mar 20 Javascript
jQuery的css() 方法使用指南
May 03 Javascript
7个jQuery最佳实践
Jan 12 Javascript
Jquery轮播效果实现过程解析
Mar 30 Javascript
在一个页面实现两个zTree联动的方法
Dec 20 Javascript
详解JavaScript的变量
Apr 04 Javascript
如何使用three.js 制作一个三维的推箱子游戏
Jul 29 Javascript
VUE 项目在IE11白屏报错 SCRIPT1002: 语法错误的解决
Sep 27 Javascript
原生JS实现拖拽效果
Dec 04 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 获取可变函数参数的函数
2009/08/26 PHP
php正则表达式使用的详细介绍
2013/04/27 PHP
深入php之规范编程命名小结
2013/05/15 PHP
php获取参数的几种方法总结
2014/02/18 PHP
PHP+Mysql实现多关键字与多字段生成SQL语句的函数
2014/11/05 PHP
php fread读取文件注意事项
2016/09/24 PHP
表单JS弹出填写提示效果代码
2011/04/16 Javascript
Javascript 修改String 对象 增加去除空格功能(示例代码)
2013/11/30 Javascript
JQuery CheckBox(复选框)操作方法汇总
2015/04/15 Javascript
JS实现漂亮的淡蓝色滑动门效果代码
2015/09/23 Javascript
基于jQuery通过jQuery.form.js插件实现异步上传
2015/12/13 Javascript
JavaScript希尔排序、快速排序、归并排序算法
2016/05/08 Javascript
Bootstrap CSS组件之面包屑导航(breadcrumb)
2016/12/17 Javascript
jquery平滑滚动到顶部插件使用详解
2017/05/08 jQuery
新手快速入门微信小程序组件库 iView Weapp
2019/06/24 Javascript
微信小程序加载机制及运行机制图解
2019/11/27 Javascript
Python实现的HMacMD5加密算法示例
2018/04/03 Python
浅析python继承与多重继承
2018/09/13 Python
Tensorflow分批量读取数据教程
2020/02/07 Python
浅谈pytorch池化maxpool2D注意事项
2020/02/18 Python
PyTorch中torch.tensor与torch.Tensor的区别详解
2020/05/18 Python
Python classmethod装饰器原理及用法解析
2020/10/17 Python
css3与html5实现响应式导航菜单(导航栏)效果分享
2014/02/12 HTML / CSS
澳大利亚时尚前卫设计师珠宝在线:Amber Sceats
2017/10/04 全球购物
丝芙兰新加坡官网:Sephora新加坡
2018/12/04 全球购物
人力资源专员自我评价怎么写
2013/09/19 职场文书
初一体育教学反思
2014/01/29 职场文书
销售主管岗位职责范本
2014/02/14 职场文书
生产文员岗位职责
2014/04/05 职场文书
母校寄语大全
2014/04/10 职场文书
C++程序员求职信范文
2014/04/14 职场文书
建筑安全责任书范本
2014/07/24 职场文书
奉献爱心演讲稿
2014/09/04 职场文书
2014年会计工作总结
2014/11/27 职场文书
2014年档案室工作总结
2014/12/01 职场文书
爱心捐款感谢信
2015/01/20 职场文书