微信小程序實現時間軸

本文實例為大傢分享瞭微信小程序實現時間軸的具體代碼,供大傢參考,具體內容如下

一、顯示樣式

二、代碼 

1.wxml:

<view class="header">
    <view class="header-left">
        <view class="header-left-top">{{selectedDay.year}}/{{selectedDay.month}}/{{selectedDay.day}}</view>
    </view>
    <view class="header-right">
        <button bindtap="returnToday" color="#4e8a8d" class=".button" round type="info">回到今天</button>
    </view>
</view>
 
<!-- 頂部日歷部分 -->
<view class="page-section-spacing">
    <!-- scroll-into-view 不能以數字開頭 -->
    <scroll-view class="scroll-view_H" scroll-x="true" bindscroll="scroll" scroll-into-view="{{intoView}}"
        style="width: 100%">
 
        <!-- 這裡用到瞭自定義屬性,需要以 data 開頭,以-連接,否則在event中獲取不到 -->
        <view wx:for="{{dayList}}" wx:for-item="item" wx:for-index="index" wx:key="index" id="view{{index}}"
            class="scroll-view-item_H {{currentIndex==index ?'active':'noactive'}}" data-index="{{index}}"
            bindtap="clickDate">
            <view class="scroll-week">周{{item.week}}</view>
            <view class="scroll-day">{{item.day}}</view>
        </view>
    </scroll-view>
</view>

2.js: 

Page({
 
    data: {
        //日期數組,每個元素都是一個對象,共有21個元素    {day: 10, month: 11, week: "二", year: 2020}
        dayList: [],
        // 一天的毫秒數
        millisecond: 86400000,
        // 生命周期函數中設置為 view7,用來控制 scroll-view 的滑動,滑動到指定項(該項的id和intoView的值相同)
        intoView: '',
        // 當前項的下標,初始值是7。從0開始,“今天”之前有7天,所以“今天”的下標是7
        currentIndex: 7,
        // 選中的日期(用戶通過點擊上面的按鈕)
        selectedDay: {},
        // 滑動動畫時長
        duration: 500,
        // swiper裡面的數據,是一個對象數組。每一個元素都代表一條記錄。 
        /*
            所有的代辦事項,是一個數組,每一個元素依舊是一個數組。任何裡面的每一個元素就是一個對象,代表一條代辦記錄
            {gmtCreate: 1605023745000, gmtModify: 1605023750000, id: 1, importance: 1, isFinished: 0,remark: "測試備註",timeFlag: 1 title: "微信小程序" uId: 1}
        */
        targetList: [],
        // swiper的高度
        widHeight: 350,
        // 用戶id,頁面加載時從全局 globalData 中獲取
        uid: "1",
        // // 完成按鈕圖標對應的 url: ../../icon/target.png   或者  ../../icon/target_ok.png
        // imageUrl: "",
        // iconClass: ""
    },
 
    clickTargetItem: function (e) {
        console.log("clickItem");
        console.log(e.currentTarget.dataset);
        this.setData({
            "message": e.currentTarget.dataset
        })
        console.log("本條記錄的id為:", e.currentTarget.dataset.id);
        console.log(this.data.targetList[this.data.currentIndex]);
    },
    // 中部 swiper 滑動觸發的點擊事件
    siwperChange: function (e) {
 
 
        // console.log(e.detail);
        // 1. 設置 data 中的 index 的值,然後上面的日歷部分的index也會改變。這樣上面日歷部分和下面的swipper部分就可以同步
        this.setData({
            "currentIndex": e.detail.current
        })
        // 2. 重新設置 siwper 的高度(先更改 currentIndex,然後在設置對應 siwper 的高度)
        // console.log("slide");
        // console.log(this.data.targetList);
        // console.log("currentIndex", this.data.currentIndex);
        // console.log(this.data.targetList[this.data.currentIndex].length);
        // console.log("myheight", myHeight);
 
        var myHeight = this.data.targetList[this.data.currentIndex].length * 135 + 3 * 70 + 176 + 100;
 
 
        wx.getSystemInfo({
            success: (result) => {
                console.log("頁面高度", result.screenHeight);
                if (myHeight < result.screenHeight) {
                    myHeight = result.screenHeight;
                }
            },
        });
 
        // 設置頁面高度和當前選擇的日期
        this.setData({
            'widHeight': myHeight,
            "selectedDay": this.data.dayList[e.detail.current]
        })
 
    },
 
    // 點擊日歷上面的日期
    clickDate: function (event) {
        console.log(event.currentTarget.dataset);
        // 設置數組下標
        this.setData({
            'intoView': "view" + event.currentTarget.dataset.index,
            'currentIndex': event.currentTarget.dataset.index
        })
 
        // 更改用戶選中的日期,然後在頁面中渲染選中的日期
        this.setData({
            "selectedDay": this.data.dayList[event.currentTarget.dataset.index]
        })
        this.onPullDownRefresh()
    },
 
    // “回到今天” 按鈕對應的點擊事件
    returnToday: function () {
        console.log("回到今天");
        this.setData({
            "intoView": "view7",
            "currentIndex": 7,
            "selectedDay": this.data.dayList[7]
        })
        this.onPullDownRefresh()
    },
 
    // 封裝的 js 函數,生成一個 dayList,裡面有最近3個禮拜的日期信息
    weekDate: function () {
 
        var dayList = [];
 
        // 獲取當前時間對應的 date 對象
        var myDate = new Date();
 
        // 因為要最近3個禮拜的日期信息,可能涉及到月份的變化所以不能簡單的對天數加1或者減1,可以先計算出毫秒數,然後轉換為日期
        var millisecond = myDate.getTime();
 
        // 為 "上一個禮拜的時間" 加入 dayList 中
        for (var i = 7; i > 0; i--) {
            // 根據毫秒數構造一個 Date 對象
            var tempDate = new Date(millisecond - i * this.data.millisecond);
 
            dayList.push({
                'day': tempDate.getDate(),
                'month': tempDate.getMonth() + 1,
                'week': this.toWeekDay(tempDate.getDay()),
                'year': tempDate.getFullYear()
            });
        }
 
        // 將 “今天” 加入 dayList 中
        dayList.push({
            'day': myDate.getDate(),
            'month': myDate.getMonth() + 1,
            'week': this.toWeekDay(myDate.getDay()),
            'year': myDate.getFullYear()
        })
 
 
        // 將 “未來2周” 加入 dayList 中
        for (var i = 1; i <= 13; i++) {
            var tempDate = new Date(millisecond + i * this.data.millisecond);
            dayList.push({
                'day': tempDate.getDate(),
                'month': tempDate.getMonth() + 1,
                'week': this.toWeekDay(tempDate.getDay()),
                'year': tempDate.getFullYear()
            })
        }
 
        return dayList;
    },
 
    // 傳入數據  講一周的某一天返回成中文狀態下的字符
    toWeekDay: function (weekDay) {
        switch (weekDay) {
            case 1:
                return '一';
                break;
            case 2:
                return '二';
                break;
            case 3:
                return '三';
                break;
            case 4:
                return '四';
                break;
            case 5:
                return '五';
                break;
            case 6:
                return '六';
                break;
            case 0:
                return '日';
                break;
            default:
                break;
        }
        return '傳入未知參數';
    },
 
    
    /**
     * 生命周期函數--監聽頁面加載
     */
    onLoad: function (options) {
 
        // 加載數據,調用封裝的方法
        this.loadingData();
 
    },
 
    // 生命周期函數:用戶下拉刷新
    onPullDownRefresh: function () {
        console.log("refresh");
 
        // 加載數據,調用封裝的方法
        this.loadingData();
    },
 
    // 封裝出來的加載數據的函數
    loadingData: function () {
        wx.showLoading({
            title: '加載中',
        })
    
        // 1. 獲取最近3周的日期信息,存入 this.data 中
        var dayList = this.weekDate();
        // 通過 scroll-into-view 設置一開始的位置
        this.setData({
            "dayList": dayList,
            "intoView": "view7"
        });
 
        // 1.1 設置當前選中的日期
        this.setData({
            "selectedDay": this.data.dayList[7]
        })
 
 
        // 2. 從 globalData 中獲取用戶openid
        var app = getApp();
        this.setData({
            "uid": wx.getStorageSync('openid')
        })
 
        // 2. 獲取代辦事項信息,根據用戶id獲取
        // 向後端服務器發送請求
        // 將當前的日期發送給後端服務器
        var myDate = new Date();
        var millisecond = myDate.getTime();
    var that=this;
        wx.request({
            url: app.globalData.url + 'api/wx/getTargetByUserId',
            method: "GET",
            data: {
                "uid": this.data.uid,
                "millisecond": millisecond,
                "currentIndex": this.data.currentIndex
            },
            success: res => {
                console.log("請求成功!")
                console.log(res.data.length);
 
                // 設置待辦事項,同時設置 swiper 的高度
                // “今天” 對應的 swiper-item 下標是7,所以選擇數組第7個元素
 
                var myHeight = res.data.length * 70 +250;
                console.log(myHeight);
                //console.log("今天的代辦事項有:", res.data[7].length)
                //console.log("myheight", myHeight);
 
                // 為瞭讓 swiper 能夠覆蓋整個頁面(隻有這樣,按住其他地方進行滑動時,也可以成功的滑動 siwpper)
                /*
                    判斷 myHeight 的高度
                    為瞭讓 swiper 能夠覆蓋整個頁面(隻有這樣,按住其他地方進行滑動時,也可以成功的滑動 siwpper)
                */
 
                wx.getSystemInfo({
                    success: (result) => {
                        console.log("頁面高度", result.screenHeight);
                        if (myHeight < result.screenHeight-250) {
                            myHeight = result.screenHeight-250;
                        }
                    },
                })
 
                this.setData({
                    'targetList': res.data,
                    'winHeight': myHeight,
 
                })
 
                // 隱藏提示框
                wx.hideLoading();
 
                // 停止下拉刷新
                wx.stopPullDownRefresh()
            }
        })
    },
 
})

3.wxss: 

/* 頂部時間展示區域 */
.header {
    width: 100%;
    height: 125rpx;
    /* background-color: palegreen; */
}
 
.header-left {
    float: left;
}
 
.header-left-top {
    height: 62.5rpx;
    line-height: 62.5rpx;
    margin-left: 25rpx;
    font-size: 40rpx;
    font-weight: 500;
    margin-top: 25rpx;
}
 
.header-left-bottom {
    height: 62.5rpx;
    margin-left: 25rpx;
}
 
.header-right {
    float: right;
    margin-right: 30rpx;
    margin-top: 25rpx;
}
 
 
/*  頂部日歷部分   */
.scroll-view_H {
    white-space: nowrap;
}
 
.scroll-view-item_H {
    display: inline-block;
    width: 14.4%;
    height: 140rpx;
    /* background-color: pink; */
    /* border: 2px solid; */
    border-bottom: 1px solid #cccccc;
 
    /* opacity: 0.5; */
    color: #96989D;
    font-size: 32rpx;
    font-family: CenturyGothic-Bold;
    font-weight: bold;
 
    padding-bottom: 30rpx;
}
 
.scroll-week {
    text-align: center;
    height: 70rpx;
    line-height: 70rpx;
}
 
.scroll-day {
    text-align: center;
    height: 70rpx;
    line-height: 70rpx;
}
 
.active .scroll-day {
    border-radius: 90rpx;
    background-color: #4e8a8d;
    color: white;
}
 
/* 中部的 swiper-item */
swiper {
    height: 100%;
}
 
.swiper-box{ display: block; height: 100%; width: 100%; overflow: hidden; }  

以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。

推薦閱讀: