微信小程序教學第三章第四節(jié)(含視頻):小程序中級實戰(zhàn)教程:下拉更新唤冈、分享峡迷、閱讀標識

下拉更新、分享你虹、閱讀標識

本文配套視頻地址:
https://v.qq.com/x/page/h0554i4u5ob.html


開始前請把 ch3-4 分支中的 code/ 目錄導入微信開發(fā)工具
這一篇中绘搞,我們把列表這塊的剩余功能做完:下拉更新、分享傅物、閱讀標識夯辖。


下拉更新功能

下拉更新這個功能與我們在第一章中寫的小 demo 所用方法一致:onReachBottom


當用戶滾動過程中觸發(fā)了 上拉 這個動作時候董饰,微信小程序會自動監(jiān)聽到并執(zhí)行 onReachBottom 這個函數(shù)蒿褂,所以我們只需要把這個監(jiān)聽事件寫好就行了:

修改 index.js,增加 onReachBottom 函數(shù):

let handler = {
    // 此處省略部分代碼

    /*
    * 每次觸發(fā)尖阔,我們都會先判斷是否還可以『加載更多』
    * 如果滿足條件贮缅,那說明可以請求下一頁列表數(shù)據(jù),這時候把 data.page 累加 1
    * 然后調用公用的請求函數(shù)
    */
    onReachBottom () {
        if (this.data.hasMore) {
            let nextPage = this.data.page + 1;
            this.setData({
                page: nextPage
            });
            this.requestArticle();
        }
    },   
}


分享功能

類似于 onReachBottom介却,分享功能也是微信自帶的一個監(jiān)聽事件回調函數(shù) onShareAppMessage谴供,它返回一個對象,對象中定義了分享的各種信息及分享成功和分享失敗的回調齿坷,具體細節(jié)可以查看分享接口官方文檔

修改 index.js桂肌,增加分享的回調事件:

let handler = {
    // 此處省略部分代碼

    /*
    * 分享
    */
    onShareAppMessage () {
        let title = config.defaultShareText || '';
        return {
            title: title,
            path: `/pages/index/index`,
            success: function(res) {
                // 轉發(fā)成功
            },
            fail: function(res) {
                // 轉發(fā)失敗
            }
        }
    },
}


閱讀標識

如何實現(xiàn)閱讀標識呢?其實思路也簡單永淌。如果用戶從列表中點擊某篇文章閱讀崎场,此篇文章肯定是需要標識的。所以我們只需要在跳轉到文章詳情之前遂蛀,把此篇文章的 contentId 緩存起來

修改 index.wxml谭跨,視圖中綁定點擊事件 bindtap="showDetail",同時增加三元判斷李滴,如果文章已經閱讀過螃宙,我們給它增加一個 class="visited" 標識:

<view class="wrapper">
    <!--repeat-->
    <view wx:for="{{ articleList }}" wx:for-item="group" wx:key="{{ group.date }}" class="group">
        <view class="group-bar">
            <view class="group-title {{ group.formateDate === '今日' ? 'on' : ''}}">{{ group.formateDate }}</view>
        </view>
        <view class="group-content">
            <!--repeat-->
            <!-- 增加點擊事件 bindtap="showDetail"  -->
            <view wx:for="{{ group.articles }}" wx:for-item="item" wx:key="{{ item.contentId }}" data-item="{{ item }}" bindtap="showDetail" class="group-content-item {{ item.hasVisited ? 'visited' : '' }}">
                <view class="group-content-item-desc ellipsis-multi-line ellipsis-line-3">{{ item.title }}</view>
                <image mode="aspectFill" class="group-content-item-img" src="{{ item.cover || defaultImg.coverImg }}" ></image>
            </view>
        </view>
    </view>

    <view hidden="{{ hasMore }}" class="no-more">暫時沒有更多內容</view>
</view>


修改 index.js,增加點擊事件的回調函數(shù) showDetail:

let handler = {
    // 此處省略部分代碼

    /*
    * 通過點擊事件所坯,我們可以獲取到當前的節(jié)點對象
    * 同樣也可以獲取到節(jié)點對象上綁定的 data-X 數(shù)據(jù)
    * 獲取方法: e.currentTarget.dataset
    * 此處我們先獲取到 item 對象谆扎,它包含了文章 id
    * 然后帶著參數(shù) id 跳轉到詳情頁面
    */
    showDetail (e) {
        let dataset = e.currentTarget.dataset
        let item = dataset && dataset.item
        let contentId = item.contentId || 0
        wx.navigateTo({
            url: `../detail/detail?contentId=${contentId}`
        });
    },
}


修改 index.js,增加處理標識功能的函數(shù) markRead芹助,并在上面的 showDetail 函數(shù)中調用:

let handler = {
    // 此處省略部分代碼

    showDetail (e) {
        let dataset = e.currentTarget.dataset
        let item = dataset && dataset.item
        let contentId = item.contentId || 0
        // 調用實現(xiàn)閱讀標識的函數(shù)
        this.markRead( contentId )
        wx.navigateTo({
            url: `../detail/detail?contentId=${contentId}`
        });
    },
    /*
    * 如果我們只是把閱讀過的文章contentId保存在globalData中堂湖,則重新打開小程序后闲先,記錄就不存在了
    * 所以,如果想要實現(xiàn)下次進入小程序依然能看到閱讀標識无蜂,我們還需要在緩存中保存同樣的數(shù)據(jù)
    * 當進入小程序時候伺糠,從緩存中查找,如果有緩存數(shù)據(jù)酱讶,就同步到 globalData 中
    */
    markRead (contentId) {
        //先從緩存中查找 visited 字段對應的所有文章 contentId 數(shù)據(jù)
        util.getStorageData('visited', (data)=> {
            let newStorage = data;
            if (data) {
                //如果當前的文章 contentId 不存在退盯,也就是還沒有閱讀,就把當前的文章 contentId 拼接進去
                if (data.indexOf(contentId) === -1) {
                    newStorage = `${data},${contentId}`;
                }
            }
            // 如果還沒有閱讀 visited 的數(shù)據(jù)泻肯,那說明當前的文章是用戶閱讀的第一篇渊迁,直接賦值就行了 
            else {
                newStorage = `${contentId}`;
            }

            /*
            * 處理過后,如果 data(老數(shù)據(jù)) 與 newStorage(新數(shù)據(jù)) 不一樣灶挟,說明閱讀記錄發(fā)生了變化
            * 不一樣的話琉朽,我們就需要把新的記錄重新存入緩存和 globalData 中 
            */
            if (data !== newStorage) {
                if (app.globalData) {
                    app.globalData.visitedArticles = newStorage;
                }
                util.setStorageData('visited', newStorage, ()=>{
                    this.resetArticles();
                });
            }
        });
    },
    resetArticles () {
        let old = this.data.articleList;
        let newArticles = this.formatArticleData(old);
        this.setData({
            articleList: newArticles
        });
    },
}


別急,寫到這里稚铣,還沒有結束呢箱叁,差最后一步了。


修改 app.js惕医,小程序初始化時候耕漱,我們從緩存中把數(shù)據(jù)拿出來,賦值給 globalData抬伺,這樣就做到了真正的閱讀標識

'use strict';

// 引入工具類庫 
import util from './utils/index';

let handler = {
    onLaunch () {
        this.getDevideInfo();

        // 增加初始化緩存數(shù)據(jù)功能
        util.getStorageData('visited', (data)=> {
            this.globalData.visitedArticles = data; 
        });
    },
    alert (title = '提示', content = '好像哪里出了小問題~請再試一次~') {
        wx.showModal({
            title: title,
            content: content
        })
    },
    getDevideInfo () {
        let self = this;
        wx.getSystemInfo({
            success: function (res) {
                self.globalData.deviceInfo = res;
            }
        })
    },
    globalData: {
        user: {
            openId: null
        },
        visitedArticles: '',
        deviceInfo: {}
    }
};

App(handler);


到此螟够,列表頁面的功能開發(fā)完成,下一篇我們將開始詳情頁面的開發(fā)

iKcamp官網:http://www.ikcamp.com

訪問官網更快閱讀全部免費分享課程:《iKcamp出品|全網最新|微信小程序|基于最新版1.0開發(fā)者工具之初中級培訓教程分享》峡钓。
包含:文章妓笙、視頻、源代碼

iKcamp原創(chuàng)新書《移動Web前端高效開發(fā)實戰(zhàn)》已在亞馬遜能岩、京東寞宫、當當開售。

【11月11號】上海iKcamp最新活動

報名地址:http://www.huodongxing.com/event/5409924174200

“天天練口語”小程序總榜排名第四拉鹃、教育類排名第一的研發(fā)團隊辈赋,面對面溝通交流。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末膏燕,一起剝皮案震驚了整個濱河市炭庙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌煌寇,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逾雄,死亡現(xiàn)場離奇詭異阀溶,居然都是意外死亡腻脏,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進店門银锻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來永品,“玉大人,你說我怎么就攤上這事击纬《悖” “怎么了?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵更振,是天一觀的道長炕桨。 經常有香客問我,道長肯腕,這世上最難降的妖魔是什么献宫? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮实撒,結果婚禮上姊途,老公的妹妹穿的比我還像新娘。我一直安慰自己知态,他們只是感情好捷兰,可當我...
    茶點故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著负敏,像睡著了一般贡茅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上原在,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天友扰,我揣著相機與錄音,去河邊找鬼庶柿。 笑死村怪,一個胖子當著我的面吹牛,可吹牛的內容都是我干的浮庐。 我是一名探鬼主播甚负,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼审残!你這毒婦竟也來了梭域?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤搅轿,失蹤者是張志新(化名)和其女友劉穎病涨,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體璧坟,經...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡既穆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年赎懦,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片幻工。...
    茶點故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡励两,死狀恐怖,靈堂內的尸體忽然破棺而出囊颅,到底是詐尸還是另有隱情当悔,我是刑警寧澤,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布踢代,位于F島的核電站盲憎,受9級特大地震影響,放射性物質發(fā)生泄漏奸鬓。R本人自食惡果不足惜焙畔,卻給世界環(huán)境...
    茶點故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望串远。 院中可真熱鬧宏多,春花似錦、人聲如沸澡罚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽留搔。三九已至更胖,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間隔显,已是汗流浹背却妨。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留括眠,地道東北人彪标。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像掷豺,于是被迫代替她去往敵國和親捞烟。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,700評論 2 345

推薦閱讀更多精彩內容