赞
踩
刚开始搞小程序,搞了一周后,可以开始写组件了,写个分页组件练练手:
父组件,json文件引入:
- "usingComponents": {
- "paging": "../../components/paging/index" //引入存放你组件的路径
- }
父组件,wxml文件使用:
<paging current-index="{{page}}" total-page="{{pageTotal}}" bind:pagingChange="pagChange"></paging>
父组件,js文件使用:
- Page({
-
- /**
- * 页面的初始数据
- */
- data: {
- page: 1,
- pageTotal: 10
- },
-
- /**
- * 生命周期函数--监听页面加载
- */
- onLoad: function (options) {
- //初始化页面
- },
-
- //页码改变事件
- pagChange: function(e){
- console.log("页码改变时传到父组件的值", e);
- }
- })
子组件,json文件定义为component:
- {
- "component": true //只有在json文件中定义component为true才能在其他页面引用组件
- }
子组件,wxml文件编写:
- <!--components/paging/index.wxml-->
- <view class="page-control">
- <view class="page-control-btns">
- <view class="page-btn {{prevBtnDis?'btn-disabled':''}}" bindtap="prevPage">上一页</view>
- <view class="page-number" bindtap="shopPagePopup"><text>{{index}}</text>/<text>{{total}}</text></view>
- <view class="page-btn {{nextBtnDis?'btn-disabled':''}}" bindtap="nextPage">下一页</view>
- </view>
- <view class="page-container" hidden="{{!pageMask}}">
- <view class="page-mask" bindtap="hidePagePopup"></view>
- <view class="page-popup">
- <view class="page-popup-box">
- <view class="page-line" wx:for="{{total}}" wx:for-index="ind" data-index="{{ind+1}}" bindtap="changePage">第{{item+1}}页</view>
- </view>
- </view>
- </view>
- </view>
子组件,wxss文件样式编辑:
- /* components/paging/index.wxss */
- view,text,image{
- padding: 0;
- margin: 0;
- box-sizing: border-box;
- }
- .page-control{
- width: 100%;
- }
- .page-control .page-control-btns{
- width: 100%;
- padding: 20rpx 0;
- display: flex;
- align-items: center;
- justify-content: space-around;
- }
- .page-control .page-control-btns .page-number{
- width: 20%;
- text-align: center;
- color: #333;
- }
- .page-control .page-control-btns .page-number:active{
- background-color: #ddd;
- }
- .page-control .page-control-btns .page-btn{
- width: 30%;
- padding: 15rpx 20rpx;
- font-size: 30rpx;
- background-color: #0099CC;
- color: #fff;
- border-radius: 10rpx;
- text-align: center;
- }
- .page-control .page-control-btns .page-btn:active{
- opacity: .5;
- }
- .page-control .page-control-btns .btn-disabled{
- background-color: #ddd;
- color: #999;
- }
- .page-container{
- position: fixed;
- top: 0rpx;
- left: 0rpx;
- width: 100%;
- height: 100%;
- z-index: 999;
- }
- .page-mask{
- width: 100%;
- height: 100%;
- position: absolute;
- left: 0;
- top: 0;
- background-color: rgba(0,0,0,0.5);
- }
- .page-popup{
- width: 100%;
- height: 100%;
- display: flex;
- flex-wrap: wrap;
- align-items: center;
- justify-content: center;
- }
- .page-popup-box{
- width: 60%;
- margin: 0 auto;
- background-color: #fff;
- height: 60%;
- border-radius: 10rpx;
- z-index: 9999;
- overflow: auto;
- }
- .page-line{
- width: 100%;
- height: 80rpx;
- line-height: 80rpx;
- padding: 0rpx 20rpx;
- border-bottom: 1rpx solid #e2e2e2;
- }
- .page-line:active{
- background-color: #ddd;
- }
子组件,js文件逻辑编写:
- // components/paging/index.js
- Component({
- /**
- * 组件的属性列表
- */
- properties: {
- currentIndex: { //当前页码
- type: Number,
- value: 1
- },
- totalPage: {
- type: Number
- }
- },
-
- /**
- * 组件的初始数据
- */
- data: {
- index: 1,
- total: 10,
- pageMask: false,
- prevBtnDis: true,
- nextBtnDis: false
- },
-
- /**
- * 组件的方法列表
- */
- lifetimes: {
- // 在组件实例进入页面节点树时执行
- attached: function () {
- this.setData({
- index: this.data.currentIndex,
- total: this.data.totalPage
- })
- },
- // 在组件实例被从页面节点树移除时执行
- detached: function () {
-
- }
- },
- methods: {
- //每次改变页码就调用该函数
- currentChangeEmit: function (touchState) {
- // 自定义组件向父组件传值
- const option = {
- currentIndex: this.data.index,
- touchState: true
- };
- if (touchState) option.touchState = !touchState;
- // pagingChange 自定义名称事件,父组件中使用
- this.triggerEvent('pagingChange', option)
- /*
- 在父组件中写上bind:pagingChanget="get_emit",在父组件中就需要调用get_emit事件
- */
- },
- //开启页码弹窗
- shopPagePopup: function () {
- this.setData({
- pageMask: true
- })
- },
- //关闭页码弹窗
- hidePagePopup: function () {
- this.setData({
- pageMask: false
- })
- },
- //更改页码点击事件
- changePage: function (e) {
- //console.log("更改页码事件:",e);
- this.setData({
- pageMask: false,
- index: e.currentTarget.dataset.index
- })
- if (this.data.prevBtnDis || this.data.nextBtnDis) {
- this.currentChangeEmit(true);
- }else{
- this.currentChangeEmit();
- }
- this.judgeBtnDis();
- },
- //上一页点击事件
- prevPage: function () {
- let num = (this.data.index == 1) ? 1 : this.data.index - 1;
- this.setData({
- index: num
- })
- if (this.data.prevBtnDis) {
- this.currentChangeEmit(true);
- } else {
- this.currentChangeEmit();
- }
- this.judgeBtnDis();
- },
- //下一页点击事件
- nextPage: function () {
- let num = (this.data.index == this.data.total) ? this.data.total : this.data.index + 1;
- this.setData({
- index: num
- })
- if (this.data.nextBtnDis) {
- this.currentChangeEmit(true);
- } else {
- this.currentChangeEmit();
- }
- this.judgeBtnDis();
- },
- //判断按钮是否为disabled
- judgeBtnDis: function () {
- let index = this.data.index;
- if (index == this.data.total) {
- this.setData({
- nextBtnDis: true
- })
- if(index==1){
- this.setData({
- prevBtnDis: true
- })
- }else{
- this.setData({
- prevBtnDis: false
- })
- }
- } else if (index == 1){
- this.setData({
- prevBtnDis: true
- })
- if (index == this.data.total){
- this.setData({
- nextBtnDis: true
- })
- }else{
- this.setData({
- nextBtnDis: false
- })
- }
- }else{
- this.setData({
- prevBtnDis: false
- })
- this.setData({
- nextBtnDis: false
- })
- }
- }
- }
- })
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。