微信小程序教学第三章第三节(含视频):小程序中级实战教程:视图与数据关联

§ 视图与数据关联

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

开始前请把 ch3-3 分支中的 code/ 目录导入微信开发工具  

首先

首先我们要做的是什么呢?直接写模板逻辑吗?不是,给用户以良好的提示是很重要的,所以,我们要做的第一件事就是,加载中...

这里我们采用官方 loading 组件,所以现在就可以直接拿来用了。

修改 index.wxml,增加 loading 组件。很明显,变量 hiddenLoading 控制着它的展示与隐藏:

<loading hidden="{{hiddenLoading}}">数据加载中</loading>

然后修改 index.js,处理 loading 组件的状态逻辑值 hiddenLoading

// 刚进入列表页面,就展示loading组件,数据加载完成后隐藏
onLoad (options) {
  this.setData({
    hiddenLoading: false
  })
  this.requestArticle()
},
// 列表渲染完成后,隐藏 loading组件
renderArticle (data) {
  if (data && data.length) {
    let newList = this.data.articleList.concat(data);
    this.setData({
    articleList: newList,
    hiddenLoading: true
    })
  }
}

分析页面结构

通过分析静态页面可以看出,这个列表是按照 为单位来分段,在每天的文章里又按照 文章 为单位继续细分。所以可以知道这个 wxml 的主体结构是循环套循环。所以我们可以初步写出下面的结构:

<loading hidden="{{hiddenLoading}}">数据加载中</loading>
<view class="wrapper">
  <view wx:for="{{ articleList }}" wx:for-item="group" wx:key="{{ group.date }}" class="group">
    <view wx:for="{{ group }}" wx:for-item="item" wx:key="{{ item.contentId }}"></view>
  </view>
</view>

这里有一点需要 注意:在 wxml 做循环嵌套的时候,一定要重新定义 wx:for-item 字段。因为 wxml 循环中当前项的下标变量名默认为 index,当前项的变量名默认为 item。如果没有重新定义 item,在内层循环里通过 item 取到的值其实是外层循环的值。

官方 API - 列表渲染

下面我们就详细的分析下具体的结构,首先,每一天都有一个日期做开头,然后下面是一天的 4 篇文章。每篇文章分为左右结构,左边是标题,最多 3 行,超过的文字就用 … 表示。右边是一张文章的封面图,如果没有封面图就用默认的封面图。上面的日期如果是今天就显示今天,否则就直接显示月日,所以可以把 wxml 结构丰富成下面的样子:

<loading hidden="{{hiddenLoading}}">数据加载中</loading>
<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-->
            <view wx:for="{{ group.articles }}" wx:for-item="item" wx:key="{{ item.contentId }}" data-item="{{ item }}" class="group-content-item">
                <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>

这里有一个图片处理的属性可以看看相应的 API 了解下:

官方 API - 图片处理

页面结构搭建完了吗?并没有,还有一件很重要的事情要做。当我们的所有内容都展示完了,我们要友好的提醒用户,所以需要在最底端加上一个提示,把这些交互考虑进去之后的 wxml 就是下面这样的:

<!--index.wxml-->
<loading hidden="{{hiddenLoading}}">数据加载中</loading>
<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-->
            <view wx:for="{{ group.articles }}" wx:for-item="item" wx:key="{{ item.contentId }}" data-item="{{ item }}" class="group-content-item">
                <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>

到此,列表的页面与大体数据可以说是告一段落了,下一节我们介绍下如何增加阅读标识功能及分享功能、下拉更新功能。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏猿人谷

有趣的Linux命令行效果

有趣的Linux命令行功效 1. Linux"sl"命令行 尽管"sl"代表了"蒸汽机机头",但它是用来提醒那些命令行控们别把"ls"打成了"sl"。让我们看看...

2068
来自专栏前端正义联盟

关于ajax学习笔记

只要这个属性值发生了变化,就会触发一个事件onreadystatechange事件,就可以使用xhr.onreadystatechange = function...

1122
来自专栏cnblogs

requirejs、vue、vuex、vue-route的结合使用,您认为可行吗?

     在五一节之前和一网友讨论前端技术时,对方提到vue、vue-route如果配合requirejs应用。当时的我没有想得很明白,也没能这位网友一个准确的...

26610
来自专栏王二麻子IT技术交流园地

七、VueJs 填坑日记之渲染一个列表

在上一篇博文中,我们对vue组件有了一个简单的认识和大概的理解。在之前认识项目结构的时候,我们在/src目录中创建了一个components的文件夹,而今天就要...

1916
来自专栏偏前端工程师的驿站

location的hash部分和使用window.onhashchange实现ajax请求内容时使用浏览器后退和前进功能

 在js跨域双向数据传递时可以用iframe加上location.hash来实现,在研究这个的时候深入学习了一下hash的特性。   hash就是uri中#及后...

21610
来自专栏Crossin的编程教室

【编程课堂】selenium 祖传爬虫利器

一些网页,比如微博,只有在登录状态才能进行页面的访问,或者对数据有比较复杂的验证和保护,直接通过网络请求进行登录并获取数据就会比较麻烦。这种时候,就该本篇的主角...

2544
来自专栏小狼的世界

PHP处理回车换行时应该注意的一个问题

在我们的数据入库、出库的时候要特别注意这个问题,特别是在进行显示处理的时候,比如使用表单中的 textarea 进行了一段文字的提交,客户端是Windows的话...

711
来自专栏Jerry的SAP技术分享

善用Object.defineProperty巧妙找到修改某个变量的准确代码位置

我今天的工作又遇到一个难题。前端UI右下角这个按钮被设置为"禁用(disabled)"状态。

1451
来自专栏有趣的Python

IDEA 神器使用技巧

标记上bookmarks之后可以ctrl 1 ctrl 2 ctrl 3 按标签序号进行跳转

913
来自专栏九彩拼盘的叨叨叨

CSS拓展语言:Sass介绍

CSS拓展语言出现的原因是,CSS自身支持的功能能有限(如不支持变量,条件控制,循环等编程元素),并不满足我们想要的一些功能。而CSS拓展语言支持CSS不支持的...

852

扫码关注云+社区