微信小程序自定义组件实现tabs选项卡功能


Posted in Javascript onJuly 14, 2018

本文为大家分享了微信小程序实现tabs选项卡功能的具体代码,供大家参考,具体内容如下

一个自定义组件由 json wxml wxss js 4个文件组成。要编写一个自定义组件,首先需要在 json 文件中进行自定义组件声明(将 component 字段设为 true 可这一组文件设为自定义组件)

components/navigator/index.json

{
 "component": true
}

components/navigator/index.wxml

<!-- 自定义tab标签组件-->
<!-- 标题列表-->
<scroll-view scroll-x="true" class="scroll-view-x" wx:if="{{!ttype || ttype==2}}">
 <view class="scroll-view-item" wx:for="{{tList}}" wx:key="*this">
 <view class="{{currentTab==(index) ? 'on' : ''}}" bindtap="_swichNav" data-current="{{index}}">{{ !tname ? item.name : item[tname].name }}</view>
 </view>
</scroll-view>
<!--内容列表-->
<slot>
</slot>

components/navigator/index.js

//组件的对外属性,是属性名到属性设置的映射表,属性设置中可包含三个字段, type 表示属性类型、 value 表示属性初始值、 observer 表示属性值被更改时的响应函数
Component({
 properties:{
 //标题列表
 tList:{
 type: Array,
 value:[]
 }, 
 //当前tab index
 currentTab:{
 type:Number,
 value:0,
 observer: function (newVal, oldVal) { 
 this.setData({
  currentTab : newVal
 })
 } 
 }
 },
 //组件的方法,包括事件响应函数和任意的自定义方法,关于事件响应函数的使用
 methods:{
 // 内部方法建议以下划线开头
 _swichNav:function(e){
 //自定义组件触发事件时,需要使用 triggerEvent 方法,指定事件名、detail对象和事件选项
 this.triggerEvent('changeCurrent', {
 currentNum: e.currentTarget.dataset.current
 })
 }
 }
})

components/navigator/index.wxss

.scroll-view-x{
 background-color: #fff;
 white-space: nowrap;
 position:fixed;
 z-index:10;
 top:0
}
.scroll-view-x .scroll-view-item{
 display:inline-block;
 margin:0 35rpx;
 line-height: 33px;
 cursor: pointer;
}
.on{
 border-bottom: 2px solid red;
 color: red
}

使用自定义组件

使用已注册的自定义组件前,首先要在页面的 json 文件中进行引用声明。此时需要提供每个自定义组件的标签名和对应的自定义组件文件路径:

pages/order-list/index.json

{
 "navigationBarTitleText":"订单列表",
 "usingComponents": {
 "slideTab": "../../components/navigator/index"
 }
}

这样,在页面的 wxml 中就可以像使用基础组件一样使用自定义组件。节点名即自定义组件的标签名,节点属性即传递给组件的属性值。

pages/order-list/index.wxml

<view >
 <slideTab tList="{{statusType}}" bind:changeCurrent="swichNav" currentTab="{{currentType}}" >
 <swiper current="{{currentType}}" duration="300" bindchange="bindChange" style="height: {{windowHeight-35}}px;margin-top:35px;">
 <block>
  <swiper-item wx:for="{{list}}">
  <view class="no-order" hidden="{{item.length ? true : false}}">
  <image src="../../assets/imgs/no-order.png" class="no-order-img"></image>
  <view class="text">暂无订单</view>
  </view>
  <scroll-view scroll-y="true" class="order-list" scroll-with-animation="true" lower-threshold="1" bindscrolltolower="scrolltolower" style="height: {{windowHeight-35}}px;" hidden="{{item ? flase : true}}">
  <view class="a-order" wx:for="{{item}}" wx:key="childIndex" wx:for-item="childItem" >
  <view class="order-date">
   <view class="date-box">下单时间:{{childItem.dateAdd}}</view>
   <view class="status {{(childItem.status==-1 || childItem.status==4) ? '':'red'}}">{{item.statusStr}}</view>
  </view>
  <view class="goods-info" bindtap="orderDetail" data-id="{{childItem.id}}">
   <view class="goods-des">
   <view>订单号 : {{childItem.orderNumber}} </view>
   <view wx:if="{{childItem.remark && childItem.remark != ''}}">备注: {{item.remark}}</view>
   </view>
  </view>
  <view >
   <scroll-view class="goods-img-container" scroll-x="true">
   <view class="img-box" wx:for="{{goodsMap[currentType][childItem.id]}}" wx:for-item="child_item">
    <image src="{{child_item.pic}}" class="goods-img"></image>
   </view>
   </scroll-view>
  </view>
  <view class="price-box">
   <view class="total-price">合计:¥ {{childItem.amountReal}}</view>
   <view class="btn cancel-btn" hidden="{{childItem.status==0? false : true}}" bindtap="cancelOrderTap" data-id="{{childItem.id}}">取消订单</view>
   <view class="btn topay-btn" hidden="{{childItem.status==0? fslse : true}}" bindtap="toPayTap" data-id="{{childItem.id}}" data-money="{{childItem.amountReal}}">马上付款</view> 
  </view> 
  </view>
  </scroll-view>
  </swiper-item>
 </block>
 </swiper>
 </slideTab>
</view>

pages/order-list/index.js

var wxpay = require('../../utils/pay.js')
var app = getApp();
Page({
 data:{
 statusType:[
 {name:"待付款",page:0},
 {name:"待发货",page:0},
 {name:"待收货",page:0},
 {name:"待评价",page:0},
 {name:"已完成",page:0}],
 currentType:0,
 list:[[],[],[],[],[]],
 goodsMap:[{},{},{},{},{}],
 logisticsMap:[{},{},{},{},{}],
 windowHeight:''
 },
 onLoad(options){
 this.getList();
 var systemInfo = wx.getSystemInfoSync()
 this.setData({
 windowHeight: systemInfo.windowHeight,
 currentType:options.id ? options.id:0
 })
 },
 // 点击tab切换 
 swichNav: function (res) {
 if (this.data.currentType == res.detail.currentNum) return;
 this.setData({
 currentType: res.detail.currentNum
 })
 } , 
 bindChange:function(e){
 this.setData({
 currentType: e.detail.current
 })
 if (!this.data.list[e.detail.current].length)
 this.getList();
 } ,
 getList(){
 wx.showLoading();
 var that = this;
 var postData = {
 token: app.globalData.token,
 status: that.data.currentType
 };
 var _page = that.data.statusType[that.data.currentType].page+1 ;;
 wx.request({
 url: app.globalData.baseUrl + '/order/list',
 data: postData,
 success: (res) => {
 wx.hideLoading();
 var param = {}, str1 = "list[" + that.data.currentType + "]", str2 = 'statusType[' + that.data.currentType + '].page', str3 = "logisticsMap[" + that.data.currentType + "]", str4 = "goodsMap[" + that.data.currentType + "]" ;
 if (res.data.code == 0) {
  param[str1] = res.data.data.orderList ;
  param[str2] = _page ;
  param[str3] = res.data.data.logisticsMap ;
  param[str4] = res.data.data.goodsMap ;
  that.setData(param);
 } else {
  param[str1] = [];
  param[str3]= {};
  param[str4] = {};
  this.setData(param);
 }
 }
 })
 },
 orderDetail: function (e) {
 var orderId = e.currentTarget.dataset.id;
 wx.navigateTo({
 url: "/pages/order-details/index?id=" + orderId
 })
 },
 cancelOrderTap: function (e) {
 var that = this;
 var orderId = e.currentTarget.dataset.id;
 wx.showModal({
 title: '确定要取消该订单吗?',
 content: '',
 success: function (res) {
 if (res.confirm) {
  wx.showLoading();
  wx.request({
  url: app.globalData.baseUrl + '/order/close',
  data: {
  token: app.globalData.token,
  orderId: orderId
  },
  success: (res) => {
  wx.hideLoading();
  if (res.data.code == 0) {
  var param = {}, str = 'statusType[' + that.data.currentType + '].page';
  param[str]=0;
  that.getList();
  }
  }
  })
 }
 }
 })
 }
})

pages/order-list/index.wxss

.container{
 width: 100%;
 background-color: #F2f2f2;
}
.status-box{
 width:100%;
 height: 88rpx;
 line-height: 88rpx;
 display: flex;
 justify-content: space-between;
 align-items: center;
 background-color: #fff;
}
.status-box .status-label{
 width: 150rpx;
 height: 100%;
 text-align: center;
 font-size:28rpx;
 color:#353535;
 box-sizing: border-box;
 position: relative;
}
.status-box .status-label.active{
 color:#e64340;
 border-bottom: 6rpx solid #e64340;
}
.status-box .status-label .red-dot{
 width: 16rpx;
 height: 16rpx;
 position: absolute;
 left: 116rpx;
 top:23rpx;
 background-color: #f43530;
 border-radius: 50%;
}
.no-order{
 width: 100%;
 position: absolute;
 bottom: 0;
 top:0;
 left: 0;
 right: 0;
 text-align: center;
 padding-top: 203rpx;
 background-color: #F2f2f2;
}
.no-order-img{
 width: 81rpx;
 height: 96rpx;
 margin-bottom: 31rpx;
}
.no-order .text{
 font-size:28rpx;
 color:#999999;
 text-align: center
}
.order-list{
 width: 100%;
}
.order-list .a-order{
 width: 100%;
 background-color: #fff;
 margin-top: 20rpx;
}
.order-list .a-order .order-date{
 padding: 0 30rpx;
 height: 88rpx;
 display: flex;
 justify-content: space-between;
 font-size:26rpx;
 color:#000000;
 align-items: center;
}
.order-list .a-order .order-date .red{
 font-size:26rpx;
 color:#e64340;
}
.a-order .goods-info,
.goods-img-container{
 width: 720rpx;
 margin-left: 30rpx;
 border-top: 1rpx solid #eee;
 border-bottom: 1rpx solid #eee;
 padding: 30rpx 0;
 display: flex;
 align-items: center;
}
.goods-info .img-box{
 width: 120rpx;
 height: 120rpx;
 overflow: hidden;
 margin-right: 30rpx;
 background-color: #f7f7f7;
}
.goods-info .img-box .goods-img,
.goods-img-container .img-box .goods-img{
 width: 120rpx;
 height: 120rpx;
}
.goods-info .goods-des{
 width: 540rpx;
 height: 78rpx;
 line-height: 39rpx;
 font-size:26rpx;
 color:#000000;
 overflow: hidden;
}
.goods-img-container{
 height: 180rpx;
 box-sizing: border-box;
 white-space: nowrap;
}
.goods-img-container .img-box{
 width: 120rpx;
 height: 120rpx;
 overflow: hidden;
 margin-right: 20rpx;
 background-color: #f7f7f7;
 display: inline-block;
}
.order-list .a-order .price-box{
 position: relative;
 width: 720rpx;
 height: 100rpx;
 margin-left: 30rpx;
 box-sizing: border-box;
 padding: 20rpx 30rpx 20rpx 0;
 display: flex;
 align-items: center;
 justify-content: space-between;
 font-size:26rpx;
}
.order-list .a-order .price-box .total-price{
 font-size:26rpx;
 color:#e64340;
}
.a-order .price-box .btn{
 width: 166rpx;
 height: 60rpx;
 box-sizing: border-box;
 text-align: center;
 line-height: 60rpx;
 border-radius: 6rpx;
 margin-left: 20rpx;
}
.a-order .price-box .cancel-btn{
 border: 1rpx solid #ccc;
 position: absolute;
 right: 216rpx;
 top:20rpx;
}
.a-order .price-box .topay-btn{
 border:1px solid #e64340;
 color: #e64340;
}

效果图

微信小程序自定义组件实现tabs选项卡功能

项目地址:微信小程序实现tabs选项卡功能

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery 如何动态添加、删除class样式方法介绍
Nov 07 Javascript
js 定时器setTimeout无法调用局部变量的解决办法
Nov 28 Javascript
node.js中实现同步操作的3种实现方法
Dec 05 Javascript
使用bootstrap typeahead插件实现输入框自动补全之问题及解决办法
Jul 07 Javascript
正则表达式基本语法及表单验证操作详解【基于JS】
Apr 07 Javascript
js实现简单数字变动效果
Nov 06 Javascript
sublime text配置node.js调试(图文教程)
Nov 23 Javascript
深入浅析javascript函数中with
Oct 28 Javascript
如何为你的JavaScript代码日志着色详解
Apr 08 Javascript
使用 webpack 插件自动生成 vue 路由文件的方法
Aug 20 Javascript
JavaScript 替换所有匹配内容及正则替换方法
Feb 12 Javascript
JavaScript 如何计算文本的行数的实现
Sep 14 Javascript
微信小程序scroll-view仿拼多多横向滑动滚动条
Apr 21 #Javascript
微信小程序实现自上而下字幕滚动
Jul 14 #Javascript
微信小程序scroll-view实现字幕滚动
Jul 14 #Javascript
微信小程序仿RadioGroup改变样式的处理方案
Jul 13 #Javascript
通过封装scroll.js 获取滚动条的值
Jul 13 #Javascript
详解vue.js根据不同环境(正式、测试)打包到不同目录
Jul 13 #Javascript
Angular5.0 子组件通过service传递值给父组件的方法
Jul 13 #Javascript
You might like
php使用pack处理二进制文件的方法
2014/07/03 PHP
php限制ip地址范围的方法
2015/03/31 PHP
php显示时间常用方法小结
2015/06/05 PHP
php+ajax制作无刷新留言板
2015/10/27 PHP
php连接微软MSSQL(sql server)完全攻略
2016/11/27 PHP
JQuery的html(data)方法与&amp;lt;script&amp;gt;脚本块的解决方法
2010/03/09 Javascript
Extjs中的GridPanel隐藏列会显示在menuDisabled中解决方法
2013/01/27 Javascript
jquery动态调整div大小使其宽度始终为浏览器宽度
2014/06/06 Javascript
connect中间件session、cookie的使用方法分享
2014/06/17 Javascript
更高效的使用JQuery 这里总结了8个小技巧
2016/04/13 Javascript
JS基于递归算法实现1,2,3,4,5,6,7,8,9倒序放入数组中的方法
2017/01/03 Javascript
JS设置CSS样式的方式汇总
2017/01/21 Javascript
ajax实现加载页面、删除、查看详细信息 bootstrap美化页面!
2017/03/14 Javascript
使用vue.js写一个tab选项卡效果
2017/03/25 Javascript
详解vue嵌套路由-query传递参数
2017/05/23 Javascript
Node.js使用gm拼装sprite图片
2017/07/04 Javascript
JS实现标签滚动切换效果
2017/12/25 Javascript
js构造函数创建对象是否加new问题
2018/01/22 Javascript
详解如何使用babel进行es6文件的编译
2018/05/29 Javascript
重学 JS:为啥 await 不能用在 forEach 中详解
2019/04/15 Javascript
vue element 生成无线级左侧菜单的实现代码
2019/08/21 Javascript
VUE兄弟组件传值操作实例分析
2019/10/26 Javascript
JavaScript写个贪吃蛇小游戏(超详细)
2020/03/17 Javascript
JS Generator 函数的含义与用法实例总结
2020/04/08 Javascript
JavaScript实现缓动动画
2020/11/25 Javascript
python中string模块各属性以及函数的用法介绍
2016/05/30 Python
Python实现ssh批量登录并执行命令
2016/10/25 Python
在python Numpy中求向量和矩阵的范数实例
2019/08/26 Python
基于python实现学生信息管理系统
2019/11/22 Python
美国精品地毯网站:Boutique Rugs
2020/03/04 全球购物
研发工程师的岗位职责
2013/11/18 职场文书
小学生打架检讨书
2014/01/26 职场文书
大学自主招生自荐信范文
2014/02/26 职场文书
司机工作自我鉴定
2014/09/19 职场文书
2016年先进班集体事迹材料
2016/02/26 职场文书
CSS3 制作的悬停缩放特效
2021/04/13 HTML / CSS