当前位置:   article > 正文

微信小程序组件: tab标签页_微信小程序tab组件

微信小程序tab组件

需求:

  1. 插槽为动态, 可以在使用页面自行设置
  2. 可以自定义设置每个tab的样式, 也可以设置容器的样式
  3. 如果tab太多, 容器可以横向滚动
  4. 设置当前tab值可以自动定位到当前tab位置

思路:

  1. slot属性name动态设置
  2. 设置默认样式, 写好公共的方法, 将对象转换成style可以用的字符串
  3. scroll-x
  4. scroll-into-view

效果图:

组件代码 ⬇️
wxml

  1. <view class="tabs-container">
  2. <scroll-view style="{{tabsConStyle}}" class="pane-con" scroll-x enhanced bounces scroll-into-view="{{currentTab}}">
  3. <view wx:for="{{tabs}}" wx:key="id" id="{{item.id}}" class="tabs-pane inline {{index === activeTab ? 'active' : ''}}" style="{{index === activeTab ? paneActiveStyle : paneStyle}}" bindtap="switchTab" data-index="{{index}}">{{item.label}}</view>
  4. </scroll-view>
  5. <block wx:for="{{tabs}}" wx:key="id">
  6. <!-- 可以使用每项对应的插槽 -->
  7. <view class="tabs-content" wx:if="{{activeTab === index}}">
  8. <slot name="{{index}}"></slot>
  9. </view>
  10. <!-- 如果使用页面中每tab只是数据不同或其它情况, 也可以使用这个默认插槽 -->
  11. <slot></slot>
  12. </block>
  13. </view>

js

  1. Component({
  2. options: {
  3. multipleSlots: true
  4. },
  5. properties: {
  6. // 必传参: tabs数组, 每项需要传一个包含属性名为label和属性名为id唯一值的对象
  7. tabs: {
  8. required: true,
  9. type: Array,
  10. value: () => {
  11. return [{
  12. label: "",
  13. id: ""
  14. }]
  15. }
  16. },
  17. // 非必传: 当前tab初始值
  18. activeTab: {
  19. type: Number,
  20. value: 0
  21. },
  22. // 非必传: 每一项的样式
  23. tabStyle: Object,
  24. // 非必传: 当前项的样式
  25. tabActiveStyle: Object,
  26. // 非必传: 可滑动tabs容器的样式
  27. tabsStyle: Object,
  28. },
  29. data: {
  30. paneStyle: "",
  31. paneActiveStyle: "",
  32. tabsConStyle: "",
  33. flag: false,
  34. // 为固定tabCon左滑的位置
  35. currentTab: "",
  36. },
  37. methods: {
  38. initTabs() {
  39. // 共三个参数的赋值过程
  40. // 思路:
  41. // 1. 都需要经过对象转字符串过程
  42. // 2. 如果有普通每项, 则先将当前项的特殊样式与普通项样式合并, 再进行字符串处理
  43. this.setData({
  44. paneStyle: this.transferObjToStr(this.data.tabStyle),
  45. paneActiveStyle: this.data.tabStyle ? this.transferObjToStr(Object.assign(this.data.tabStyle, this.data.tabActiveStyle)) : this.transferObjToStr(this.data.tabActiveStyle),
  46. tabsConStyle: this.transferObjToStr(this.data.tabsStyle),
  47. })
  48. },
  49. switchTab(event) {
  50. // 切换方法: 设置当前项, 并传值
  51. this.setData({
  52. activeTab: event.currentTarget.dataset.index,
  53. })
  54. this.triggerEvent('switchTab', this.data.activeTab);
  55. },
  56. transferObjToStr(obj) {
  57. // 小程序中style不可以像VUE一样直接使用对象, 而传入的是对象, 这一步是将传入的style对象转换成组件中可以直接使用的字符串
  58. if (!obj) return "";
  59. let str = "";
  60. for (let key in obj) {
  61. str += `${key}: ${obj[key]};`;
  62. }
  63. return str;
  64. },
  65. },
  66. lifetimes: {
  67. attached() {
  68. this.initTabs();
  69. }
  70. },
  71. observers: {
  72. tabs: function (tabs) {
  73. // 将来可能会做tabs增删改的功能(我自己想的哈哈哈哈哈)这步的意思是头一次进入页面才需要判断有无activeTab
  74. // 单拿出来监听tabs: activeTab的设置, 必须得在tabs赋值之后
  75. if (this.data.flag) return;
  76. if (tabs.length > 0) {
  77. // 代表tabs赋值完毕
  78. this.setData({
  79. flag: true,
  80. // 自动定位当前tab
  81. currentTab: this.data.activeTab === 0 ? "" : this.data.tabs[this.data.activeTab].id
  82. })
  83. }
  84. }
  85. },
  86. })

wxss

  1. /* 样式重点是这个容器: 宽度为本身容器的100%, 横向溢出滑动并且不能换行 */
  2. .pane-con {
  3. width: 100%;
  4. overflow-x: scroll;
  5. overflow-y: hidden;
  6. white-space: nowrap;
  7. }
  8. /* 取消滚动条展示 */
  9. .pane-con::-webkit-scrollbar {
  10. display: none;
  11. }
  12. .inline {
  13. display: inline-block;
  14. }
  15. .tabs-pane {
  16. padding: 10rpx 20rpx;
  17. margin-right: 16rpx;
  18. border: 1px solid lightgrey;
  19. border-radius: 8rpx;
  20. transition: all .1s ease-in;
  21. }
  22. .tabs-pane:nth-last-child(1) {
  23. margin-right: 0;
  24. }
  25. .tabs-pane.active {
  26. background: #5495df;
  27. border-color: #5495df;
  28. color: #fff;
  29. }

使用页面代码就不放了因为是正在研发的项目, 按照注释设置参数即可.
需要传当前值的时候用trigger.event的方法将值传出去接收即可~

tada~~~一个自定义的tab就完成啦

微信小程序组件: tab标签页,微信小程序组件: tab标签页,微信小程序组件: tab标签页,微信小程序组件: tab标签页,微信小程序组件: tab标签页,微信小程序组件: tab标签页

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/726931
推荐阅读
相关标签
  

闽ICP备14008679号