uniapp 制作一个可复用的segmented-control(tab选项卡)

开局一张图,内容全靠编

1.开局一张图(先上效果图)

2.内容全靠编

开始编写复用组件:

 segmented-control.vue

<template><view id="segmented" class="segmented" :style="{top:stickyTopData+'px'}"><view class="line" :style="{transform:'translateX('+offsetLeft+'px)',width:lineWidth+'px'}"></view><view class="segmented-control"><view :id="'sc-'+index" :data-index="index" v-for="(item, index) in values" class="segmented-control-item" :key="index" :class="index === current ? 'active' : ''"@click="onClick">{{item}}</view></view></view></template><script>
export default {name: 'segmented-control',props: {values: { // 要显示的数组type: Array,default() {return [];}},stickyTop:{ // 距离头部多少px将其固定type: Number,default(){return 0;}},current: { // 当前选中第几个type: Number,default(){return 1;}}},data() {return {lineWidth: 0, // 线的宽度offsetLeft: 0 // 相对左边的距离};},methods: {/*** 点击事件*/onClick(e) {let index = parseInt(e.mp.target.dataset.index);let that = this;let id = e.mp.target.id;if (that.current !== index) {that.$emit('clickItem', index); // 父级组件回调方法}}},mounted() {let that = this;if (that.values) {if (that.values && that.values[that.current]) {that.lineWidth = 0;setTimeout(() => { // 延时获取线的宽度和左边距离const query = uni.createSelectorQuery();query.select('#sc-' + that.current).boundingClientRect();query.exec(res => {that.offsetLeft = res[0].left + 16;that.lineWidth = res[0].width - 70;});}, 500);}}},computed:{stickyTopData:function(){return uni.upx2px(this.stickyTop); // 顶部固定显示距离}},watch: {current(newValue, oldValue) {let that = this;setTimeout(() => { // 监听当前选择的item变化,重新计算线的宽和左边的距离const query = uni.createSelectorQuery();query.select('#sc-' + newValue).boundingClientRect();query.exec(res => {that.offsetLeft = res[0].left + 16;that.lineWidth = res[0].width - 70;});}, 200);}},
};
</script><style lang="less">
.segmented {position: sticky;
}
.segmented-control {display: flex;background: #ffffff; align-items: center;padding: 20upx;border-bottom: 1px solid #f6f6f6;.segmented-control-item {width: 178upx;font-size: 32upx;color: #999;}.active {color: #333;}
}
.line {height: 6upx;border-radius: 3upx;background-color: #E5A600;position: absolute;top: 80upx;left: 0;transition: all 0.3s;
}
</style>

开始编写父级组件来调用复用组件

list.vue

<template><view><segmented-controlid="tabbar":values="items":stickyTop="108":current="current"@clickItem="onClickItem"></segmented-control><view class="list" id="list">{{ current }}</view></view>
</template><script>
import segmentedControl from '@/components/segmented-control';export default {components: {segmentedControl},data() {return {items: ['已完成', '已拒绝', '已取消'],current: 0};},methods: {/*** 点击segmentedControl 事件回调*/onClickItem(index) {if (this.current !== index) {this.current = index;}}}
};
</script><style lang="less">
@import '../../css/list.less';
</style>

完事了,上图

线的宽度、过渡的时间、样式什么的自己调一调,改一改就行了

uniapp 制作一个可复用的segmented-control(tab选项卡)相关推荐

  1. 基于JavaSpringBoot+uniapp制作一个打卡小程序

    生活中打卡的场景无处不在,上班打卡.景点打卡.活动打卡.课堂考勤打卡.在CSDN的APP上也有签到打卡,打卡的意义并在于打卡本身,而是在于能够成为更好的自己:跟随此文制作一个打卡系统互相督促.互相鼓励 ...

  2. 一个页面可以重复调用的TAB选项卡切换js代码 鼠标悬浮

    /*下面是景点页面的变动代码*/ .tabbox {height: 176px;padding-bottom: 10px;} .tabmenu {height:25px;background:url( ...

  3. 使用element UI 快速制作一个列表页面

    使用element制作一个列表页面,并且当点击"查看调查问卷"时弹出弹框. (图一) (图二) (图三) 1. 制作一个名叫DataListTable <DataListTa ...

  4. 32位mips运算器logisim_大神教你制作一个简单的16位CPU

    如何制作一个简单的16位CPU,首先我们要明确CPU是做什么的,想必各位都比我清楚,百度的资料也很全..... 如果想要制作一个CPU,首先得明白下计算机的组成结构(或者计算机的替代品,因为并不是只有 ...

  5. 如何制作一个简单的16位CPU

    http://www.acfun.tv/v/ac362187 我果然标题党了吗?不是转载那本日本人写的书啊!纯手打表诚意,希望猴子给过,第一次投稿各位大神帮帮忙...... 如何制作一个简单的16位C ...

  6. 制作一个用户头像选择器仿 WeGame

    制作一个用户头像选择器仿 WeGame CropAvatar 作者:WPFDevelopersOrg - 驚鏵 原文链接:https://github.com/WPFDevelopersOrg/WPF ...

  7. 使用C# winform 制作一个按钮可自适应屏幕大小的 简易加减乘除计算器

    一:成果物     不多展示,,,我们开始吧.. 二: 窗体包含内容 2.1 显示屏部分组成 显示屏部分由两个组件组成,一个是方便操作的panel控件位于顶部,且为了使其显示屏在改变窗体大小时一直位于 ...

  8. 如何制作一个注册表文件

    1.制作一个注册表文件首先要了解注册表的格式:(可先去导出一个注册表文件,用记事本打开做为参照) 第一行:REGEDIT4 或是Windows Registry Editor Version 5.00 ...

  9. ESP32制作一个拟辉光管时钟

    拟辉光管时钟 60 多年过去了,尽管辉光管已经停产,有很多工程师仍然对它情有独钟.我用 8 块液晶显示屏制作了一个拟辉光管时钟,感受复古元素的美感,表达对过去经典的敬意. 项目起源 看过<命运石 ...

最新文章

  1. 个人知识管理系统 mysql_个人知识管理系统Version1.0开发记录(04)
  2. 多线程 阻塞队列中的poll与take区别
  3. boost::mp11::mp_map_update相关用法的测试程序
  4. win7安装git客户端和简单配置
  5. 前端绘制绘制图表_绘制图表(第2页):JavaScript图表库的比较
  6. python bytes 改值_python3 bytes 和 string转换
  7. 2017.9.23 循环格 思考记录
  8. Tableau的简单数据可视化操作
  9. 注释可以出现在c语言任何位置,在c程序中,注释语句只能位于一条语句的后面吗...
  10. Linux 密码复杂度
  11. [如何构建自己的轮式移动机器人系统·从入门到放弃]机器人底层篇
  12. java多线程-线程池
  13. java获取当前系统时间
  14. 分享微信预约系统开发制作步骤_教你实现微信公众预约系统的方法
  15. 设置网页默认浏览IE版本
  16. 微信公众号支付开发(java)实例详解
  17. 杭州电子科技大学计算机考研资料汇总
  18. 怎么理解数据湖?(深度长文)
  19. 分享优质JAVA学习网站
  20. javaScript字符串比较

热门文章

  1. 常用的统计分析方法总结(聚类分析、主成分分析、因子分析)
  2. java between_Java Period between()用法及代码示例
  3. 谁说路由远程控制是智能路由的专属?TP-LINK也玩远程控制!
  4. python教程1001python教程 - 百度_用python解析处理百度地图的xml文件
  5. ueditor编辑器只上传视频video时,获取内容为空
  6. 文件操作【fopen/fclose/fputs/fgets】【C语言/进阶】
  7. 重庆自考和成人高考有何区别?哪个含金量更高?
  8. MySQL数据库下 delete from x where id=?会发生什么锁
  9. 零基础CSS入门教程(9)–class选择器
  10. Matroska文件解析之SimpleBlock