在微信小程序的开发过程当中,当你想要实现不一样页面间的数据绑定,却为此抓耳饶腮时,不妨让微信小程序与filter 来一场完美的邂逅,相信会给你带来别样的惊喜~html
前段时间被安利了一个很实用的公众号—前端早读课,它简洁、大方的页面和方便、实用的功能深深地吸引着我~(^U^)ノ 刚好这段时间学了小程序,就本身仿着写了个前端早读课的小程序。前端
整个项目包括“每日一看”、“看看世界”、“情报局”和“介绍”四个主页面。git
在开发“每日一看”页面的过程当中,我遇到了一个难题,如何将“每日一看”页面中获取的数据与阅读详情页的数据绑定起来,也就是从这时起,微信小程序开始邂逅filter~github
下面简单介绍一下filter~小程序
filter 是一个基于数组的方法,经过一个回调函数对数组进行筛选,并返回数组中知足条件的元素,至关于过滤器的效果。微信小程序
数组对象(arry)数组
每一个filter 方法都有一个数组对象,经过该方法对数组里的元素进行筛选。bash
具体用法: arry.filter();
复制代码
回调函数(callbackfn)微信
对于数组中的每一个元素,filter 方法都会调用callbackfn 函数一次。微信开发
具体用法: function callbackfn(value, index, array);
复制代码
其中 value 表示数组元素的值,index 表示数组元素的下标, array 表示包含该元素的数组。
返回值
filter 方法的返回值是一个数组,包含全部知足回调函数条件的值。
更多详情: filter文档
敲黑板的重点来啦!!!
<navigator url="./detail/detail?id={{id}}">
<button class="page_bd_motto_read">阅读</button>
</navigator>
复制代码
that.setData({
headline: arr[index].headline,
from: arr[index].from,
// 设置id做为阅读详情页的一个钩子
id: arr[index].acticle_id
})
}
})
复制代码
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);
}
})
}
})
复制代码
<!--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~
在开发过程当中,遇到了一些坑,在此总结一下~
这个公众号一大亮点就是能够随机显示文章,每次点进去的文章都不同,感觉度极佳。这里采用随机函数来获取数组的下标,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
})
}
})
},
})
复制代码
以前开发的时候以为这个方法若是本身写还蛮难的,后面百度了一下,发现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;
}
},
复制代码
在对首页进行鼠标点击效果的开发过程当中,一开始想到的就是使用伪元素来添加点击按钮的样式效果,后面出现了一个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>
复制代码
使用swiper组件实现对页面的左右滑动的效果。
<!--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>
复制代码
<view class="page__bd">
<block wx:for="{{intelligence_list}}" wx:key="{{index}}" center >
<template is="intelligence_list" data="{{...item}}"></template>
</block>
</view>
复制代码