微信小程序教学第三章第四节(含视频):小程序中级实战教程:下拉更新、分享、阅读标识

下拉更新、分享、阅读标识

本文配套视频地址:
https://v.qq.com/x/page/h0554...


开始前请把 ch3-4 分支中的 code/ 目录导入微信开发工具
这一篇中,我们把列表这块的剩余功能做完:下拉更新、分享、阅读标识。

下拉更新功能

下拉更新这个功能与我们在第一章中写的小 demo 所用方法一致:onReachBottom

当用户滚动过程中触发了 上拉 这个动作时候,微信小程序会自动监听到并执行 onReachBottom 这个函数,所以我们只需要把这个监听事件写好就行了:

修改 index.js,增加 onReachBottom 函数:

let handler = {
    // 此处省略部分代码

    /*
    * 每次触发,我们都会先判断是否还可以『加载更多』
    * 如果满足条件,那说明可以请求下一页列表数据,这时候把 data.page 累加 1
    * 然后调用公用的请求函数
    */
    onReachBottom () {
        if (this.data.hasMore) {
            let nextPage = this.data.page + 1;
            this.setData({
                page: nextPage
            });
            this.requestArticle();
        }
    },
}

分享功能

类似于 onReachBottom,分享功能也是微信自带的一个监听事件回调函数 onShareAppMessage,它返回一个对象,对象中定义了分享的各种信息及分享成功和分享失败的回调,具体细节可以查看分享接口官方文档

修改 index.js,增加分享的回调事件:

let handler = {
    // 此处省略部分代码

    /*
    * 分享
    */
    onShareAppMessage () {
        let title = config.defaultShareText || ‘‘;
        return {
            title: title,
            path: `/pages/index/index`,
            success: function(res) {
                // 转发成功
            },
            fail: function(res) {
                // 转发失败
            }
        }
    },
}

阅读标识

如何实现阅读标识呢?其实思路也简单。如果用户从列表中点击某篇文章阅读,此篇文章肯定是需要标识的。所以我们只需要在跳转到文章详情之前,把此篇文章的 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,增加点击事件的回调函数 showDetail:

let handler = {
    // 此处省略部分代码

    /*
    * 通过点击事件,我们可以获取到当前的节点对象
    * 同样也可以获取到节点对象上绑定的 data-X 数据
    * 获取方法: e.currentTarget.dataset
    * 此处我们先获取到 item 对象,它包含了文章 id
    * 然后带着参数 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,增加处理标识功能的函数 markRead,并在上面的 showDetail 函数中调用:

let handler = {
    // 此处省略部分代码

    showDetail (e) {
        let dataset = e.currentTarget.dataset
        let item = dataset && dataset.item
        let contentId = item.contentId || 0
        // 调用实现阅读标识的函数
        this.markRead( contentId )
        wx.navigateTo({
            url: `../detail/detail?contentId=${contentId}`
        });
    },
    /*
    * 如果我们只是把阅读过的文章contentId保存在globalData中,则重新打开小程序后,记录就不存在了
    * 所以,如果想要实现下次进入小程序依然能看到阅读标识,我们还需要在缓存中保存同样的数据
    * 当进入小程序时候,从缓存中查找,如果有缓存数据,就同步到 globalData 中
    */
    markRead (contentId) {
        //先从缓存中查找 visited 字段对应的所有文章 contentId 数据
        util.getStorageData(‘visited‘, (data)=> {
            let newStorage = data;
            if (data) {
                //如果当前的文章 contentId 不存在,也就是还没有阅读,就把当前的文章 contentId 拼接进去
                if (data.indexOf(contentId) === -1) {
                    newStorage = `${data},${contentId}`;
                }
            }
            // 如果还没有阅读 visited 的数据,那说明当前的文章是用户阅读的第一篇,直接赋值就行了
            else {
                newStorage = `${contentId}`;
            }

            /*
            * 处理过后,如果 data(老数据) 与 newStorage(新数据) 不一样,说明阅读记录发生了变化
            * 不一样的话,我们就需要把新的记录重新存入缓存和 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,小程序初始化时候,我们从缓存中把数据拿出来,赋值给 globalData,这样就做到了真正的阅读标识

‘use strict‘;

// 引入工具类库
import util from ‘./utils/index‘;

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

        // 增加初始化缓存数据功能
        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);

到此,列表页面的功能开发完成,下一篇我们将开始详情页面的开发

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

访问官网更快阅读全部免费分享课程:《iKcamp出品|全网最新|微信小程序|基于最新版1.0开发者工具之初中级培训教程分享》。
包含:文章、视频、源代码

iKcamp原创新书《移动Web前端高效开发实战》已在亚马逊、京东、当当开售。

【11月11号】上海iKcamp最新活动

报名地址:http://www.huodongxing.com/ev...

“天天练口语”小程序总榜排名第四、教育类排名第一的研发团队,面对面沟通交流。

原文地址:https://www.cnblogs.com/jlfw/p/12200687.html

时间: 2024-08-08 17:08:52

微信小程序教学第三章第四节(含视频):小程序中级实战教程:下拉更新、分享、阅读标识的相关文章

微信小程序教学第四章第二节(含视频):小程序中级实战教程:详情-视图渲染

§ 详情 - 数据渲染 本文配套视频地址:https://v.qq.com/x/page/x0555... 开始前请把 ch4-2 分支中的 code/ 目录导入微信开发工具 这一节中,我们开始详情的接口调用.数据加载和视图渲染过程. Step 1. 引入公用的一些工具库,修改 detail.js: 'use strict'; import util from '../../utils/index'; import config from '../../utils/config'; // WxP

微信小程序教学第二章(含视频):小程序中级实战教程之预备篇 - 封装网络请求及 mock 数据

§ 封装网络请求及 mock 数据 本文配套视频地址:https://v.qq.com/x/page/i0554... 开始前请把 ch2-3 分支中的 code/ 目录导入微信开发工具 上一节中,我们对 index.js 文件中增加了 util 对象,并在对象中封装了很多公用方法 let util = { log(){--}, alert(){--}, getStorageData(){--}, setStorageData(){--} } 本节中,我们对常用的网络请求方法 wx.reques

第二百二十四节,jQuery EasyUI,ComboGrid(数据表格下拉框)组件

jQuery EasyUI,ComboGrid(数据表格下拉框)组件 学习要点: 1.加载方式 2.属性列表 3.方法列表 本节课重点了解 EasyUI 中 ComboGrid(数据表格下拉框)组件的使用方法,这个组件 依赖于 Combo(自定义下拉框)和 DataGrid(数据表格)组件. 一.加载方式 class 加载方式 <select id="box" class="easyui-combogrid" name="dept" sty

Git帮助文档阅读笔记----第二章-第四--节远程仓库的使用

管理这些远程仓库,以便推送或拉取数据 添加远程库 移除废弃的远程库 管理各式远程库分支 定义是否跟踪分支 查看当前的远程库 可以用 git remote 命令,它会列出每个远程库的简短名字 也可以加上 -v 选项(译注:此为 --verbose 的简写,取首字母),显示对应的克隆地址: 如果有多个远程仓库,此命令将全部列出.比如在我的 Grit 项目中,可以看到: 添加远程仓库 要添加一个新的远程仓库,可以指定一个简单的名字,以便将来引用,运行 git remote add [shortname

第三百九十四节,Django+Xadmin打造上线标准的在线教育平台—Xadmin集成富文本框

第三百九十四节,Django+Xadmin打造上线标准的在线教育平台-Xadmin集成富文本框 首先安装Django Ueditor1.8.143模块 下载地址 https://pypi.python.org/pypi/DjangoUeditor/1.8.143 下载后  python setup.py install  安装 安装好后在settings.py将DjangoUeditor添加到app INSTALLED_APPS = [ 'django.contrib.admin', 'djan

软件构造 第三章第五节 ADT和OOP中的等价性

第三章第五节 ADT和OOP中的等价性 1.==与equals ==是引用等价性 :而equals()是对象等价性. == 比较的是索引.更准确的说,它测试的是指向相等(referential equality).如果两个索引指向同一块存储区域,那它们就是==的.对于我们之前提到过的快照图来说,==就意味着它们的箭头指向同一个对象. equals()操作比较的是对象的内容,换句话说,它测试的是对象值相等(object equality).在每一个ADT中,equals操作必须合理定义 2.等价性

软件构造 第七章第四节 调试

第七章第四节 调试 [bug的常见类型] 数学bug:例如 零除法,算术溢出 逻辑bug:例如 无线循环和无限递归 源头bug:例如 使用了为被定义的变量.资源泄漏,其中有限的系统资源如内存或文件句柄通过重复分配耗尽而不释放.缓冲区溢出,其中程序试图将数据存储在分配存储的末尾. 团队工程bug:例如 评论过时或者评论错误.文件与实际产品的区别 ## 调试的基本过程 Debug是测试的后续步骤:测试发现问题,debug消除问题:当防御式编程和测试都无法挡住bug时,我们就必须进行debug了: D

JS复习:第三章&amp;第四章

第三章 一.把一个值转换成字符串的两种方法: 1.使用每个值都有的toString( )方法.这个方法唯一要做的就是返回相应值的字符串表现.例如: var age = 11 ; var ageAsString = age.toString( ) ;       //字符串”11” var found = true ; var foundAsString = found.toString( ) ;    //字符串”true” 2.在不知道要转换的值是不是null或undefined的情况下,还可

Learn Prolog Now 翻译 - 第三章 - 递归 - 第二节,规则顺序,目标顺序,终止

内容提要 规则顺序 目标顺序 终止 Prolog是第一门比较成功的逻辑编程语言.逻辑编程语言内在实现是简单和富有魅力的:程序员的工作简单地说就是描述问题:程序员应该写下(使用语言的逻辑)声明性的规格说明 (即,一个知识库),去描述有趣的状态.事实和关系:程序员不应该告诉计算机如何去实现,而他根据问一些问题去获取信息,逻辑编程语言会给出答案. 然而,以上是理想情况,Prolog本身也确实通过一些重要的特征,往这个方向在努力.但是Prolog不是,重复一次,不是一门完整的逻辑编程语言.如果你只是从声