微信小程序——用Lin UI实现瀑布流和触底加载

总之先上效果图


image.png

瀑布流是使用Lin UI实现的所以要先安装Lin UI

数据请求与处理

原始的api有两个参数

  • start 获取记录的起始序号
  • count 一次获取记录的条数

这是封装后的函数之后会用到

static async getLatestSpu(start, count)

这是请求到的数据格式

{
"total":1,  // 数据总条数
    "count":10, // 每页展示条数
    "page":0,   // 页码
    "total_page":1, // 总页数
    "items":[
        {
            "title":"ins复古翠绿NoteBook",
            "subtitle":"林白默默的掏出小本本,将她说的话一次不漏的记了下来。",
            "img":"",
            "price":"29.99",
            "discount_price":"27.8",
            "description":null,
            "tags":"林白推荐"   // 标签以$分割
        }
    ]
}

瀑布流组件的使用方法

Lin UI中的瀑布流组件使用了小程序中抽象节点l-water-flow-item中传入一个组件作为瀑布流中的单元格,之后通过wx.lin.renderWaterFlow(data, refresh, success)函数进行渲染其中data参数需要一个数组是瀑布流中所需要的数据,refresh参数为是否刷新数据(删除之前已经加载的数据),success渲染成功后的回调函数

编写瀑布流需要的组件

先新建一个组件。
根据需求Lin UI中的card组件tag组件和price组件很适合用来编写需要的瀑布流单元格先把他们在json文件中引入

{
  "component": true,
  "usingComponents": {
    "l-card": "/miniprogram_npm/lin-ui/card/index",
    "l-tag": "/miniprogram_npm/lin-ui/tag/index",
    "l-price": "/miniprogram_npm/lin-ui/price/index"
  }
}

这是组件的js文件

Component({
  properties: {
    data: Object,   // 接收瀑布流数组元素
    showBasePrice: { // 显示原价
      type: Boolean,
      value: false
    }
  },
  data: {
    tags: []  // 标签数组
  },
  lifetimes: {
    attached() {
      const tags = this.properties.data.tags.split('$');  // 将标签分割成数组
      this.setData({tags});
    }
  }
});

有的地方瀑布流不需要显示原价showBasePrice属性可以用来控制是否显示原价
接下来是wxml文件

<l-card type="cover" image="{{data.img}}" title="{{data.title}}" image-mode="widthFix"
        l-class="card-container" l-img-class="card-img" l-title-class="card-title">
    <view class="content-text">
        <view class="tag-container">
            <block wx:for="{{tags}}">
                <l-tag wx:if="{{item}}" bg-color="#DCEBE6" font-color="#557862" l-class="tag-item">{{item}}</l-tag>
            </block>
        </view>
        <view class="price">
<!--            需要显示原价且有优惠价-->
            <block wx:if="{{showDiscount && data.discount_price}}">
                <l-price unit="¥" value="{{data.discount_price}}" unit-color="#557862" value-color="#557862" size="36" bold="600"/>
                <l-price unit="¥" wx:if="{{data.price}}" unit-color="#666" value="{{data.price}}" deleted value-color="#666" del-color="#666"/>
            </block>
<!--            不需要显示原价-->
            <l-price unit="¥" wx:elif="{{data.discount_price}}" value="{{data.discount_price}}" unit-color="#557862" value-color="#557862" size="36" bold="600"/>
            <l-price unit="¥" wx:else value="{{data.price}}" unit-color="#557862" value-color="#557862" size="36" bold="600"/>
        </view>
        <text class="describe">{{data.subtitle}}</text>
    </view>
</l-card>

wxml中用到的组件用法参考
card组件文档
tag组件文档
price组件文档

wxss文件就不贴了

触底加载

小程序中因为有onReachBottom()函数触底加载比较好实现,分页的控制比较麻烦,所以我写了一个PageBean用来控制分页

export class PageBean {
    count;  // 每页条数
    start;  // 开始位置
    total;  // 总数据条数
    isEnd = false;  // 是否是最后一页
    
    // 初始化
    constructor(count = 6) {
        this.start = 0;
        this.count = count;
    }

    // 将pageBean的属性改到下一页
    nextPage() {
        if (!this.total || (this.start + this.count) < this.total) {
            this.start += this.count;
        } else {
            this.isEnd = true;
        }
    }
}

下面是触底翻页的代码

async onReachBottom() {
    // 判断本页不是最后一页且没有在加载
    if (!this.page.isEnd && !this.data.onLoad) {
        // 设置状态正在加载
        this.setData({
            onLoad: true
        });
        const spuList = await Spu.getLatestSpu(this.page.start, this.page.count);
        wx.lin.renderWaterFlow(spuList.items, false, () => {
            this.page.nextPage();
            // 设置状态为加载完毕
            this.setData({
                onLoad: false
            })
        });
    } else if (this.page.isEnd) {
        this.setData({
            isEnd: true
        });
    }
}

page是PageBean的实例化对象,在第一次加载数据时设置page对象的total值,这样可以保证加载到最后一条后不再加载。onLoad是表示是否正在加载isEnd表示是否加载到最后一页

交互反馈

触底加载需要提示用户加载状态这个微信的wx.showToast()可以做到但是感觉太low了,Lin UI有一个Loadmore组件可以做底部提示

RW5CNX.jpg

是这样用的

<view>
    <l-water-flow generic:l-water-flow-item="r-goods-water"/>
    <l-loadmore show="{{onLoad}}" type="loading" loading-text="正在加载" line/>
    <l-loadmore show="{{isEnd}}" type="end" end-text="到底了" line/>
</view>

用到的属性的含义
show:是否显示页底提示
type:页底提示类型
loading-text:加载中状态的文案
end-text:加载完成状态的文案
line:是否显示分割线

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容

  • 因新工作主要负责微信小程序这一块,最近的重心就移到这一块,该博客是对微信小程序整体的整理归纳以及标明一些细节点,初...
    majun00阅读 7,314评论 0 9
  • 连接连接 大哥大法官
    禾枫沐雨阅读 347评论 0 0
  • 今天你在意的一切,困住你的枷锁,所有的、明天都将不复存在。 你在意什么,就会为什么所困。
    墨迹未染阅读 251评论 0 0
  • 听着一曲《红豆》安慰着入梦,词那么动容,王菲唱的那么情真,似幻影中点点滴滴的相思梦…… 忍不住拿起手机,敲打起心中...
    上善若水菇凉阅读 278评论 0 0