推荐一个小程序补丁 github:miniprogrampatch,为你的 PageComponent 增加 watchcomputed 特性。

安装

通过 npm 安装:npm install --save miniprogrampatch

或者直接拷贝 miniprogrampatch.js 到项目中。

用法

miniprogrampatch.js 非常简单,它只有两个函数 patchPagepatchComponent

假定你的项目目录结构如下:

  • app.js
  • miniprogrampatch.js
  • pages/
    • index/index.js
  • components/
    • MyComponent/index.js

app.js 中:

const { patchPage, patchComponent } = require('./miniprogrampatch');

App({
// 公共依赖通过 app.deps 来提供
deps: {
patchPage, patchComponent
}
})

pages/index/index.js 中:

const { patchPage } = getApp().deps;

patchPage(Page)({
computed: {
// 定义计算属性
}, watch: {
// 定义 watch 回调
}
})

同理,在 components/MyComponents/index.js 中:

const { patchComponent } = getApp().deps;

patchComponent(Component)({
computed: {
// 定义计算属性
}, watch: {
// 定义 watch 回调
}
})

如果你想在已有项目中使用 miniprogrampatch,但又担心引入新的第三方代码影响整个项目,那么你可以通过以上方法为单个页面或组件增加新特性。

如果你想整个项目所有页面和组件都使用新特性,又不想在每个页面或组件逐个引用 patchPage 或 patchComponent,那么可以通过以下示例为整个项目添加补丁。

app.js 中:

const { patchPage, patchComponent } = require('./miniprogrampatch');

// 让所有页面或组件都可以直接定义 watch 和 computed
Page = patchPage(Page);
Component = patchComponent(Component); App({})

定义 computed

Page({

    data: {
count: 10
}, computed: {
/** 页面加载的时间戳(不依赖其他属性) */
timestamp() {
return Date.now();
}, /** count 乘以 10(依赖属性 count) */
countByTen: {
require: ['count'],
fn({ count }) {
return count * 10
}
}, /** count 乘以 100(依赖另一个计算属性 countByTen)*/
countByHundred: {
require: ['countByTen'],
fn({ countByTen }) {
return countByTen * 10;
}
}, /** 计算属性也可以是嵌套的路径 */
'x.y.z': {
require: ['countByHundred'],
fn({ countByHundred }) {
return countByHundred;
}
}
}
});

在 computed 中通过 key:value 形式来定义计算属性。

  • key:计算属性名称或路径。
  • value
    • 如果 valuefunction,函数计算结果即为属性值。
    • 如果 valueplain object,它必须有一个名为 fn 字段作为计算函数。可选字段 require 必须是一个数组,数组内显式指定当前计算属性所依赖的其他属性名称或路径。

注意:

  • 所有没有指定依赖字段的计算属性(即未提供 require 字段),仅在初始化时求一次值,之后将不会有任何变化。
  • 计算属性非只读,它可以被 setData 方法赋值,但每次它依赖的属性发生变化,它会被重新计算赋值。
  • 计算属性在每次数据更新时检查是否要重新计算,计算结果和更新数据合并一起被设置到 this.data 中,这一过程是同步处理。

定义 watch

Page({
watch: {
// 嵌套路径监听
'x.y': function (value, old) {
console.log('x.y', value === old);
}, // 监听属性
x(value, old) {
console.log('x', value === old);
},
}
})

watch 就比较简单了,定义你想要监听的属性名称或路径,如果被监听属性发生变化就触发回调函数。

$setData

别名:updateData

被 patch 过的 Page 或 Component 实例 this 拥有一个名为 $setData 的方法,用来设置 data 同时触发 computed 属性更新以及 watch 监听检查。

在微信小程序基础库 v2.2.2 以下版本,Page 或 Component 的 setData 方法由于会被定义为只读属性,无法覆写,因此必须使用 $setData 来触发数据更新检查。

在微信小程序基础库 v2.2.3 以上版本,Page 和 Component 的 setData 等效于 $setData,可以直接使用 setData 来触发数据更新。

miniprogrampatch 提供 watch 和 computed 特性的更多相关文章

  1. Spring Boot提供的特性

    一.导览 本文主要按以下模块介绍spring Boot(1.3.6.RELEASE)提供的特性. SpringApplication类 外部化配置 Profiles 日志 开发WEB应用 Securi ...

  2. Javascript面向对象特性实现封装、继承、接口详细案例——进级高手篇

    Javascript面向对象特性实现(封装.继承.接口) Javascript作为弱类型语言,和Java.php等服务端脚本语言相比,拥有极强的灵活性.对于小型的web需求,在编写javascript ...

  3. (转)C++0x语言新特性一览

    转自:http://blog.csdn.net/zwvista/article/details/2429781 原文请见http://en.wikipedia.org/wiki/C%2B%2B0x. ...

  4. 使用Modernizr探测HTML5/CSS3新特性(转载)

    转载地址:http://www.cnblogs.com/TomXu/archive/2011/11/18/detecting-html5-css3-features-using-modernizr.h ...

  5. 黑马程序员——【Java高新技术】——JDK1.5新特性:静态导入、可变参数、增强型for循环、自动装箱拆箱、枚举

    ---------- android培训.java培训.期待与您交流! ---------- 一.静态导入 1.import和import static区别: (1)import 是导入一个类或某个包 ...

  6. Orchard内置特性(以模块来说的)

    本文链接:http://www.cnblogs.com/souther/p/4539169.html 主目录 Orchard中有很多可以直接和多次使用的特性,这些东西在官方的Gallery中可以找到. ...

  7. 使用Modernizr探测HTML5/CSS3新特性

    [转] HTML5, CSS3以及相关技术(例如canvas和web sockets)带来了非常有用的特性,可以让我们的web程序提升一个新的level.这些新技术允许我们只用HTML,CSS和Jav ...

  8. 【转载】《Ext JS 4 First Look》翻译之一:新特性

    免责声明:     本文转自网络文章,转载此文章仅为个人收藏,分享知识,如有侵权,请联系博主进行删除.     原文作者:^_^肥仔John      原文地址:http://www.cnblogs. ...

  9. Servlet 3.0 新特性

    Servlet 3.0 作为 Java EE 6 规范体系中一员,随着 Java EE 6 规范一起发布.该版本在前一版本(Servlet 2.5)的基础上提供了若干新特性用于简化 Web 应用的开发 ...

随机推荐

  1. Jsp俩大内置对象学习

    https://www.cnblogs.com/smyhvae/p/4065790.html post与get的区别 最直观的区别就是GET把参数包含在URL中,POST通过request body传 ...

  2. pandas快速入门

    pandas快速入门 numpy之后让我们紧接着学习pandas.Pandas最初被作为金融数据分析工具而开发出来,后来因为其强大性以及友好性,在数据分析领域被广泛使用,下面让我们一窥究竟. 本文参考 ...

  3. win7的python3.5安装numpy包

    1.你需要先确保已经安装了pip(因为我是我们需要用pip安装numpy包),我在cmd里面输入pip能显示pip的有关信息,所以我已经安装了pip了(其实是python3.x自带了pip) 如果没有 ...

  4. poi 升级至4.x 的问题总结(POI Excel 单元格内容类型判断并取值)

    POI Excel 单元格内容类型判断并取值 以前用 cell.getCachedFormulaResultType() 得到 type 升级到4后获取不到了 换为:cell.getCellType( ...

  5. 解决本地文件上传时fakepath的问题

    $("input[type='file']").on('change', function () { var oFReader = new FileReader(); var fi ...

  6. VMware中虚拟机与主机不能ping通解决办法

    先去看看服务全部启动了没? VMware相关服务启动关闭脚本     启动了还报错,接着往下看......     一.如果是桥接模式,那么 可能性1:虚拟机防火墙禁ping,请关闭虚拟机防火墙重试: ...

  7. Swoole PHP windows composer

    直接下载了 Swoole PHP 的 Windows 版安装包来用,遇到需要 Composer. 先是下载了 composer.phar.在这里下的 https://getcomposer.org/d ...

  8. datagrip离线安装驱动jar

    问题描述: datagrip离线安装驱动,在线的安装驱动一般默认安装在当前用户下.DataGrip xxxx 问题解决: 在线在线下载驱动jar,复制jar到内网离线环境 01.外网已经存在的jar提 ...

  9. MATLAB 统计不同区间中元素的个数

    使用 find 命令: x = :;%生成数组 k = find( x > & x < );%查找大于2小于5的元素的数组下标 size(k,) %统计的元素的个数

  10. 分析轮子(一)-ArrayList.java

    前言:之前也看过一些JDK源码,不过没有留下痕迹,经久年月就淡忘了,现在的时机也差不多了,想再看一次,并且记录下来自己的感想,于是从自己使用最多最熟悉的地方开始!并且看的过程中,我希望自己思考一下如下 ...