由于微信小程序 技术生态比较闭合,导致很多 现代前端框架很多积累出的成果都没有实现(可能未来会逐一实现). 用惯了现代 再耍小程序 总感觉很不顺手.

需要结果的请直接看最后的WXS

View Filter

filter 理解为管道加工处理, 你扔给我一组数据 经过各种不同类型的管道加工 产出新的数据 但是又不会影响修改原数据, 最终展示给用户.

现有前端框架filter一般:

 time | dateTime('yyy-mm-dd')

使用 | 作为管道符 传递参数进行序列化

缺陷:

截止目前,小程序官方并没有管道实现方式,以下列出了替代几种方案,供大家选择使用.

直接修改原数据

在请求完成之后 对返回值data进行一次数据处理 比如 抽象一个_formatListData方法对 返回进行二次处理.


_formatListData(list) {
return list.map((item) => {
let date = FormatUtil.getDateTime(item.childBirth);
item.filterChildBirth = `${date.y}-${date.M}-${date.d}`;
return item;
}
}

这种方式会给原数据添加新字段 filterChildBirth (原字段为 childBirth) . 最终展示也是显示filterChildBirth 到view上面,多个需要filter的字段都通过这种方式去处理,很明显 对一些业务型filter倒还好 如果遇到filter需要 共享 就比较坑.

ES6 get


data : {
time : 1511748300571
} get time (){
return FormatUtil.getDate(this.data.time);
}

通过get方法来实现对字段显示过滤. 只能操作对象 对数组中的item 比较无力.

WXS

微信小程序的架构分为 app-service 和 page-frame,分别运行于不同的线程。你在开发时写的所有 JS 都是运行在 app-service 线程里的,而每个页面各自的 WXML/WXSS 则运行在 page-frame 中。app-service 与 page-frame 之间通过桥协议通信(包括 setData 调用、canvas指令和各种DOM事件),涉及消息序列化、跨线程通信与evaluateJavascript()。这个架构的好处是:分开了业务主线程和显示界面,即便业务主线程非常繁忙,也不会阻塞用户在 page-frame 上的交互。一个小程序可以有多个 page-frame (webview),页面间切换动画比SPA更流畅。坏处是:在 page-frame 上无法调用业务 JS。跨线程通信的成本很高,不适合需要频繁通信的场景。业务 JS 无法直接控制 DOM。
作者:鲁小夫
链接:https://www.zhihu.com/questio...

了解了wxs 设计初衷,我们也就知道能做什么事情了.
wxs 目前主要是增强 wxml 标签的表达能力

ps : 因为运行在不同线程所以 js与wxs 不能相互引用的. 这就有可能在js中使用公共方法 在wxs中需要重新写一份(为了共享filter) 造成代码冗余.

通过wxs 实现共享filter:

  1. 首先我们建立共享filter文件夹,实现一个日期格式化

  1. WXS 实现日期格式化(es6语法不能使用)

       var DateFr = {
    
        getDate: function (time, splitStr) {
    
       if (!time) return '';
    
       var date =getDate(time);
    var M = date.getMonth() + 1;
    var y = date.getFullYear();
    var d = date.getDate(); if (M < 10) M = "0" + M;
    if (d < 10) d = "0" + d; if (splitStr)
    return y +splitStr + M +splitStr+d;
    else
    return {
    y: y,
    M: M,
    d: d
    };
    }
    } module.exports = {
    getDate: DateFr.getDate
    }
  2. 在业务页面wxml中引用wxs


    <wxs module="dateFr" src="../../../../filter/dateFr.wxs"></wxs>

    使用filter

          <text >{{dateFr.getTime(item.createdAt,':')}}</text>

    结尾

    wxs 基本满足filter的场景:

共享filter场景 采用3
业务filter很多场景 采用1,3
简单业务filter 数据非数组型场景 采用2
小程序还有很长的路要走,仍需继续努力.

微信小程序 使用filter过滤器几种方式的更多相关文章

  1. 微信小程序 - 传参的几种方式

    1. navigator navigator?第一参数&第二参数 .... 在传递页面的options可以拿到传递过来的参数 <navigator url='start-test/sta ...

  2. 微信小程序回到顶部的两种方式

    一,使用view形式的回到顶部 <image src='../../img/button-top.png' class='goTop' hidden='{{!floorstatus}}' bin ...

  3. 去除富文本中的html标签及vue、react、微信小程序中的过滤器

    在获取富文本后,又只要显示部分内容,需要去除富文本标签,然后再截取其中一部分内容:然后就是过滤器,在微信小程序中使用还是挺多次的,在vue及react中也遇到过 1.富文本去除html标签 去除htm ...

  4. 微信小程序传参数的几种方法

    1,navigator 跳转时 wxml页面(参数多时可用“&”) <navigator url='../index/index?id=1&name=aaa'></n ...

  5. 微信小程序里使用过滤器

    新建一个 filter.wxs文件 function formatString(val, len) { if (val.length > len) { return val.substring( ...

  6. 智能小程序关于Filter过滤器的简单使用

    <filter module="swan"> export default { imgurl: (imgUrl) => { var imgurlprefix = ...

  7. 微信小程序 - setData:key的几种用法

    1. 常量key渲染   2. 变量key渲染(字符串和变量先拼接) 3.对象key渲染

  8. 微信小程序使用函数的三种方法

    使用来自不同页面的函数 函数写在util.js页面 function formatTime(date) { var year = date.getFullYear() var month = date ...

  9. 盘点微信小程序跨页面传值的若干方式

    直接给大家上干货 1.跳转页面传递参数 pageA.wxml <button type="primary" bindtap="jumpTo">点击跳 ...

随机推荐

  1. JavaScript与C#互通的DES加解密算法的实现(转)

    本文提供了一个能使JavaScript与C#互通的DES加解密算法的实现,在前台页面中用JavaScript版本的DES算法将数据加密之后,传到服务器端,在服务器端可用C#版本的DES解密算法将其解密 ...

  2. LeetCode-006-Z 字形变换

    Z 字形变换 题目描述:将一个给定字符串 s 根据给定的行数 numRows ,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "PAYPALISHIRING" 行数为 ...

  3. LeetCode-045-跳跃游戏 II

    跳跃游戏 II 题目描述:给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 你的目标是使用最少的跳跃次数到达数组的最后一个位置. 假设你总是可以到 ...

  4. MaRVIN

    [ResourceRegistration] 加给Resource类 [ResourceReference(--)] 加给Resource类中引动到的Resource类,引用多个的话用IReferen ...

  5. 矩池云上如何修改cuda版本

    cuda版本可能对系统,驱动版本会有影响,修改之前需要先进行确认 1.检查系统版本 source /etc/os-release && echo $VERSION_ID 2.导入apt ...

  6. mysql命令flush privileges命令

    修改一个用户的密码,命令如下 mysql> update user set password=password('新密码') where user='用户名'; 执行后报错: ERROR 105 ...

  7. yum 安装的历史与撤销(yum history undo )

    我们可以使用yum history 来查看yum的历史记录 想撤销安装则输入 yum history undo <ID号> 即可撤销yum的安装/升级

  8. 恢复mysql管理员密码

    1.向mysqld server 发送kill命令关掉mysqld server(不是 kill -9),存放进程ID的文件通常在MYSQL的数据库所在的目录/var/lib/mysql中.# kil ...

  9. Java反射详解篇--一篇入魂

    1.反射概述 Java程序在运行时操作类中的属性和方法的机制,称为反射机制. 一个关键点:运行时 一般我们在开发程序时,都知道自己具体用了什么类,直接创建使用即可.但当你写一些通用的功能时没办法在编写 ...

  10. 数据库中间件ShardingSphere-Proxy(一)

    1.现实中的问题 我们知道数据库的数据,基本80%的业务是查询,20%的业务涵盖了增删改,经过长期的业务变更和积累数据库的数据到达了一定的数量之后,直接影响的是用户与系统的交互,查询时的速度,插入数据 ...