当微信小程序遇上filter~
在微信小程序的开发过程中,当你想要实现不同页面间的数据绑定,却为此抓耳饶腮时,不妨让微信小程序与filter 来一场完美的邂逅,相信会给你带来别样的惊喜~
前段时间被安利了一个很实用的公众号—前端早读课,它简洁、大方的页面和方便、实用的功能深深地吸引着我~(^U^)ノ 恰好这段时间学了小程序,就自己仿着写了个前端早读课的小程序。
实现的功能
- 不同页面间的数据绑定
- 随机显示数组里的元素
- 实时显示系统的日期
- 鼠标点击和页面跳转等基本功能
- swiper组件和template样式模板的使用
- 使用easy mock模拟后台数据并进行动态传参
项目展示
整个项目包括“每日一看”、“看看世界”、“情报局”和“介绍”四个主页面。

完美邂逅~
在开发“每日一看”页面的过程中,我遇到了一个难题,如何将“每日一看”页面中获取的数据与阅读详情页的数据绑定起来,也就是从这时起,微信小程序开始邂逅filter~

下面简单介绍一下filter~
filter华丽登场~
filter 是一个基于数组的方法,通过一个回调函数对数组进行筛选,并返回数组中满足条件的元素,相当于过滤器的效果。
filter的三要素
数组对象(arry)
每个filter 方法都有一个数组对象,通过该方法对数组里的元素进行筛选。
具体用法: arry.filter();
回调函数(callbackfn)
对于数组中的每个元素,filter 方法都会调用callbackfn 函数一次。
具体用法: function callbackfn(value, index, array);
其中 value 表示数组元素的值,index 表示数组元素的下标, array 表示包含该元素的数组。
返回值
filter 方法的返回值是一个数组,包含所有满足回调函数条件的值。
更多详情: filter文档
别样的惊喜~
filter的骚操作—实现数据的动态绑定
敲黑板的重点来啦!!!
- 在 dairy.wxml 页面中用 navigator 组件实现 ‘每日一看’ 页面和 ‘阅读详情’ 页的跳转,并传递一个 id 参数,每篇文章都有唯一的一个 id,这样就可以通过 js 使用 filter 过滤器筛选出两个 id 相等的文章数据,也就实现了数据的动态绑定。
<navigator url="./detail/detail?id={{id}}">
<button class="page_bd_motto_read">阅读</button>
</navigator>
- 在 dairy.js 中,因为页面每次都是随机显示一篇文章,这时就需要获取该文章的id,并作为参数,当页面跳转时作为一个钩子把两个页面联系起来。
that.setData({
headline: arr[index].headline,
from: arr[index].from,
// 设置id作为阅读详情页的一个钩子
id: arr[index].acticle_id
})
}
})
- 当页面跳转到详情页时,在 detail.js 中使用 filter 把 acticle_id 等于上一页面文章 id 的数据赋值给 datas,再对其进行操作,就实现了数据的动态绑定。
Page({
data: {
// 表示该篇文章
item: []
},
onLoad: function(params) {
// 检验id是否传递成功
console.log(params.id);
var that = this;
wx.request({
url: 'https://www.easy-mock.com/mock/5a2b5f76158e7b70032804d0/getActicleInfo/getActicleInfo',
success: function(res) {
// 使用过滤器把id等于上一页面id的数组赋值给datas
var datas = res.data.data.acticle_List.filter(item => {
return item.acticle_id == params.id;
});
that.setData({
item: datas
});
console.log(datas);
}
})
}
})
- 在 detail.wxml 中对传入的 item 数据进行调用,于是别样的惊喜就出现啦~
<!--pages/dairy/detail/detail.wxml-->
<view class="page__hd">
<view class="page__hd_title center">{{item[0].headline}}</view>
<view class="page__hd_author">作者:@{{item[0].author}}</view>
</view>
<view class="page__bd">
<text class="page__bd_content center">{{item[0].content}}</text>
</view>
特别注意: 可能有细心的人儿已经发现为什么这里用的是 item[0]. 来调用,而不是 **item.**来调用,这是数据索引的问题。如下图所示,我的数据是个三级结构,item 表示的是最外层的文章数组元素,要获取文章的作者或标题等信息,必须使用 item[0]. 才能进行调用。只有理解数据索引的本质,才能准确地调用数据。

于是,小程序在遇上filter后,就创造出了别样的惊喜 O(∩_∩)O~
一起排坑~
在开发过程中,遇到了一些坑,在此总结一下~
1. 随机显示数组里的元素
这个公众号一大亮点就是可以随机显示文章,每次点进去的文章都不一样,感受度极佳。这里采用随机函数来获取数组的下标,Math.random()函数是获取[0,1)之间的数,Math.floor()函数是向下取整,这样就可以随机获取相应的下标数。
onLoad: function () {
var that = this;
wx.request({
url: 'https://www.easy-mock.com/mock/5a2b5f76158e7b70032804d0/getActicleInfo/getActicleInfo',
method: 'GET',
data: {},
success: function(res) {
//获取文章数据的列表
var arr = res.data.data.acticle_List;
//用随机函数随机获取数组的下标
var index = Math.floor(Math.random()*arr.length);
// console.log(arr[index].acticle_id);
that.setData({
headline: arr[index].headline,
from: arr[index].from,
// 设置id作为阅读详情页的一个钩子
id: arr[index].acticle_id
})
}
})
},
})
2. 实时显示系统的日期
之前开发的时候觉得这个方法如果自己写还蛮难的,后面百度了一下,发现js里面提供了相应的API,直接使用就好,特别方便。有关系统时间的API
//监听页面显示
// day:星期几
// date:某日
// month:月份
onShow: function () {
var myDate = new Date();
// setData设置或更新数据
this.setData({
date: myDate.getDate(),
month: myDate.getMonth() + 1,
day: week(),
});
function week(day) {
switch(myDate.getDay()) {
case 1: day="星期一"; break;
case 2: day="星期二"; break;
case 3: day="星期三"; break;
case 4: day="星期四"; break;
case 5: day="星期五"; break;
case 6: day="星期六"; break;
default: day="星期天";
}
return day;
}
},
3. 用hover实现鼠标点击效果
在对首页进行鼠标点击效果的开发过程中,一开始想到的就是使用伪元素来添加点击按钮的样式效果,后面出现了一个bug,当我点击按钮跳转到另一个页面,再回退到原页面时,还是处于点击态的样式,这时百度就起了很大的作用,我上网百度了很久,才发现有hover属性中的hover-stay-time为动画持续的时间,hover-class 为定义点击按钮时的样式,于是这个bug就解决啦~
<view class="page__bd">
<view class="page__bd_tab" hover-class="active" hover-stay-time="2000">
<view class="page__bd_tab_item" hover-class="active1" hover-stay-time="2000" bindtap="dairyRead">每日一看</view>
<view class="page__bd_tab_item" hover-class="active1" hover-stay-time="2000" bindtap="lookWorld">看看世界</view>
<view class="page__bd_tab_item" hover-class="active1" hover-stay-time="2000" bindtap="intelligence">情报局</view>
<view class="page__bd_tab_item" hover-class="active1" hover-stay-time="2000" bindtap="introduction">简介</view>
</view>
</view>
4. 页面左右滑动的效果
使用swiper组件实现对页面的左右滑动的效果。

5. template 模板样式的使用

当一串代码面临复制粘贴时,这时就应该考虑对其进行封装,这样直接在不同的地方调用就好了,也完成了代码的优化。小程序中的 template 模板就很好地帮我们解决了这个问题,并通过 is 属性来实现调用。
- template 模板的定义:
<!--pages/common/list_intelligence/list_intelligence.wxml-->
<template name = "intelligence_list">
<view class="page__cell">
<view class="page__cell_headline center">
<view class="page__cell_headline_img">
<image src="{{avatar}}"/>
</view>
<view class="page__cell_headline_author">{{author}}分享于</view>
<view class="page__cell_headline_time">{{share_time}}</view>
</view>
<view class="page__cell_detail center">{{content}}</view>
</view>
</template>
- template 模板的调用:
<view class="page__bd">
<block wx:for="{{intelligence_list}}" wx:key="{{index}}" center >
<template is="intelligence_list" data="{{...item}}"></template>
</block>
</view>
我有话要说~
- 开发的过程中难免会出现各种各样的bug,记得一定要百度,百度,百度呀!!!这是个独立思考的过程,对能力的提高也非常有帮助~做这个项目最大的心得便是看太多不如干一场,肯定会干货满满,收获满满哟~
- 这个小程序后续还会完善,感兴趣的可以持续关注哟(^U^)ノ~
一波安利~
微信小程序开发教程手册
微信小程序官方开发文档
使用 easy-mock 构造后台虚拟数据
使用微信开发者工具进行开发
最后献上 github地址 里面有源代码,若是喜欢,希望大家给个star 鼓励一下啦~ღ( ´・ᴗ・` )比心
当微信小程序遇上filter~的更多相关文章
- 微信小程序实现上拉和下拉加载更多
在上一篇文章中,我们知道了使用 scroll-view 可以实现上拉加载更多,但是由于 scroll-view 的限制,它无法实现下拉加载更多,这篇文章我们使用 view 组件来实现 上拉和下拉加载更 ...
- 动手开发一个名为“微天气”的微信小程序(上)
引言:在智能手机软件的装机量中,天气预报类的APP排在比較靠前的位置.说明用户对天气的关注度非常高.由于人们不管是工作还是度假旅游等各种活动都须要依据自然天气来安排.跟着本文开发一个"微天气 ...
- 5行代码实现微信小程序图片上传与腾讯免费5G存储空间的使用
本文介绍了如何在微信小程序开发中使用腾讯官方提供的云开发功能快速实现图片的上传与存储,以及介绍云开发的 5G 存储空间的基本使用方法,这将大大提高微信小程序的开发效率,同时也是微信小程序系列教程的视频 ...
- 快速高效实现微信小程序图片上传与腾讯免费5G存储空间的使用
本文介绍了如何在微信小程序开发中使用腾讯官方提供的云开发功能快速实现图片的上传与存储,以及介绍云开发的 5G 存储空间的基本使用方法,这将大大提高微信小程序的开发效率 对于一般的图片上传功能开发,我们 ...
- 微信小程序--地图上添加图片
如何在微信小程序地图添加上,添加图片? 在微信小程序中,地图的层级最高,所以我们没有办法,通过定位,在地图上添加图片等信息; 处理办法: 添加控件:controls; 其中有个属性position,进 ...
- 微信小程序图片上传并展示
1.首先编写微信小程序的页面和样式: index.js var total = []; Page({ data: { perImgSrc: [] }, onLoad: function (option ...
- 微信小程序---图片上传+服务端接受
原文地址:http://blog.csdn.net/sk719887916/article/details/54312573 微信小程序,图片上传,应用地方-修改用户信息的头像. 详细代码: 小程序的 ...
- 微信小程序图片上传和裁剪
本篇博客用于解决微信小程序图片裁剪问题 图片裁剪常用于头像选择和图片合成等. 图片裁剪解决方案: 目前网络上知名的微信小程序图片裁剪插件是we-cropper(文末有链接) 操作步骤:下载好we-cr ...
- 微信小程序文件上传结合lin ul
html <l-form name="goods" l-form-btn-class="l-form-btn-class" bind:linsubmit= ...
随机推荐
- MySQL_学习资料
https://mp.weixin.qq.com/s/qOmyaEEpVJTUMZYfomp3ug
- VMware-workstation虚拟机安装及配置
目录 安装准备 开始安装 设置虚拟机文件默认位置 安装准备 系统环境:Windows10 专业版 软件:VMware-workstation-full-14.0.0.24051.exe 秘钥:FF31 ...
- drf中的请求模块和渲染模块
请求模块:request对象 APIView request.py # 在rest_framework.request.Request实例化方法中 self._request = request 将原 ...
- 十八、linux系统分区
一.磁盘存储结构图:这里注意下,分区标有64字节,则每个分区有16字节,MBR引导分区有446字节,共有510字节,一个扇区有512字节,还有俩个字节是分区结束标识.比如隐藏文件等标识,都是这2个字节 ...
- 吴裕雄--天生自然python学习笔记:python 用pygame模块处理音频文件
除了对图片. Word 等普通格式的文件进行处理外, Python 还有强大的多媒体文件操作能力,如对音频.视频 文件的操作 . 如果要播放音乐,我们可以用 pygame 包中的 mixer 对 象. ...
- LeetCode No.118,119,120
No.118 Generate 杨辉三角 题目 给定一个非负整数 numRows,生成杨辉三角的前 numRows 行. 在杨辉三角中,每个数是它左上方和右上方的数的和. 示例 输入: 5 输出: [ ...
- 隐马尔可夫随机场HMM
概率知识点: 0=<P(A)<=1 P(True)=1;P(False)=0 P(A)+P(B)-P(A and B) = P(A or B) P(A|B)=P(A,B)/P(B) =&g ...
- 吴裕雄--天生自然python学习笔记:python实现自动网页测试
Python 可实现的网页测试的功能十分强大,甚至能通 过编程来实现让绝大多数的测试过程自动化. 这对很多开 发者来说,绝对是不可多得的神器. hash lib 纽件可以判别文件是否有过更改,只需要用 ...
- 吴裕雄--天生自然 HADOOP大数据分布式处理:安装配置JAVA
tar -xzvf jdk-8u151-linux-x64.tar.gz -C /usr/local/src sudo vim /etc/profile .编辑/etc/profile # JAVA ...
- python语法基础-函数-迭代器和生成器-长期维护
############### 迭代器 ############## """ 迭代器 这是一个新的知识点 我们学习过的可以迭代的对象有哪些? list str ...