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 相关文章推荐
ExtJS 工具栏 分页事件参数
Mar 05 Javascript
treepanel动态加载数据实现代码
Dec 15 Javascript
javascript中直接写php代码的方法
Jul 31 Javascript
javascript 获取模态窗口的滚动位置代码
Aug 06 Javascript
js获取时间(本周、本季度、本月..)
Nov 22 Javascript
javascript面向对象之共享成员属性与方法及prototype关键字用法
Jan 13 Javascript
javascript实现添加附件功能的方法
Nov 18 Javascript
Javascript农历与公历相互转换的简单实例
Oct 09 Javascript
微信小程序开发之大转盘 仿天猫超市抽奖实例
Dec 08 Javascript
Vue.js组件间的循环引用方法示例
Dec 27 Javascript
layer.js之回调销毁对话框的例子
Sep 11 Javascript
layer.open提交子页面的form和layedit文本编辑内容的方法
Sep 27 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框架的性能
2008/01/10 PHP
php递归删除目录下的文件但保留的实例分享
2014/05/10 PHP
PHPUnit + Laravel单元测试常用技能
2019/11/06 PHP
Javascript实例教程(19) 使用HoTMetal(5)
2006/12/23 Javascript
读jQuery之十四 (触发事件核心方法)
2011/08/23 Javascript
cookie 最近浏览记录(中文escape转码)具体实现
2013/06/08 Javascript
js 图片随机不定向浮动的实现代码
2013/07/02 Javascript
读取input:file的路径并显示本地图片的方法
2013/09/23 Javascript
window.open打开页面居中显示的示例代码
2013/12/27 Javascript
JavaScript的removeChild()函数用法详解
2015/12/27 Javascript
全面了解javascript中的错误处理机制
2016/07/18 Javascript
AngularJS入门教程之Select(选择框)详解
2016/07/27 Javascript
AngularJS extend用法详解及实例代码
2016/11/15 Javascript
微信小程序request请求后台接口php的实例详解
2017/09/20 Javascript
vue-cli 默认路由再子路由选中下的选中状态问题及解决代码
2018/09/06 Javascript
Vue.js仿Select下拉框效果
2020/02/18 Javascript
ElementUI中el-tree节点的操作的实现
2020/02/27 Javascript
浅析TypeScript 命名空间
2020/03/19 Javascript
bootstrapValidator表单校验、更改状态、新增、移除校验字段的实例代码
2020/05/19 Javascript
Python修改MP3文件的方法
2015/06/15 Python
Python实现读写INI配置文件的方法示例
2018/06/09 Python
python爱心表白 每天都是浪漫七夕!
2018/08/18 Python
浅谈Django的缓存机制
2018/08/23 Python
django-xadmin根据当前登录用户动态设置表单字段默认值方式
2020/03/13 Python
Python如何实现后端自定义认证并实现多条件登陆
2020/06/22 Python
详解HTML5中的picture元素响应式处理图片
2018/01/03 HTML / CSS
澳大利亚领先的亚麻品牌:Bed Threads
2019/12/16 全球购物
应聘自荐书
2013/10/08 职场文书
2014年情人节活动方案
2014/02/16 职场文书
报关专员求职信范文
2014/02/22 职场文书
书法大赛策划方案
2014/06/04 职场文书
2014年工人工作总结
2014/11/25 职场文书
2015年度党风廉政建设工作情况汇报
2015/01/02 职场文书
2015年党员公开承诺书范文
2015/01/22 职场文书
民政工作个人总结
2015/02/28 职场文书
详解Laravel制作API接口
2021/05/31 PHP