推荐一个小程序补丁 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. Java 接口 Comparable

    compareTo方法是Comparable接口中唯一的方法.类实现了该接口后表明它的实例具有内在的排序关系.当该对象小于.等于或大于指定对象的时候,分别返回一个负整数.0或者正整数.如果由于指定对象 ...

  2. sql 索引笔记2

    以下资料都来于MSDN. 聚集索引指南: 一.此列和列值供内部使用,用户不能查看或访问. 查询注意事项 在创建聚集索引之前,应先了解数据是如何被访问的.考虑对具有以下特点的查询使用聚集索引: 使用运算 ...

  3. [Nuget]使用Nuget管理工具包

    摘要 这里演示如何使用Nuget对类库进行打包,并将类库上传到nuget上面. 步骤 1.在nuget官网注册账号,并登陆. https://www.nuget.org 2.下载Nuget.exe,并 ...

  4. /debug/requests is already registered. You may have two independent copies of golang.org/x/net/trace in your binary, trying to maintain separate state. This may involve a vendored copy of golang.org/x

    找到问题就很好解决了,直接百度  go依赖管理-govendor go get -u github.com/kardianos/govendor 先获取这个,然后将govendor.exe放入path ...

  5. Elastic{ON}参会随手记

    Elastic{ON} 同事送了一张Elastic{ON}的票,因为我们的产品中用到的ELK全家桶,实话说用的体量还挺大的,因此非常想去参加这次的发布会. 7.0的新特性 上午的会议是来自总部的一名工 ...

  6. pip安装pycrypto报错:Microsoft Visual C++ 14.0 is required. 和 SSLError: HTTPSConnectionPool的解决办法

    今天本打算把[Python3爬虫]网易云音乐爬虫 的代码敲一遍, 但是在安装pycrypto老是报错, 由于我计算是win10, 并且也有vs2017 python3环境下安装pycrypto的一些问 ...

  7. 连接postgres特别消耗cpu资源而引发的PostgreSQL性能优化考虑

    由于是开发阶段,所以并没有配置postgres的参数,都是使用安装时的默认配置,以前运行也不见得有什么不正常,可是前几天我的cpu资源占用突然升高.查看进程,发现有一个postgres的进程占用CPU ...

  8. Delphi提取PDF文本

    生成PDF的控件很多,但解析的不是太多,pdf Toolkit可以,但测试的第一个复杂的pdf就报告错误,并且汉字乱码,可能使用的版本或使用方法不对. 想起之前使用java调用的Apache名下的pd ...

  9. Xcode9.2打包图片显示异常解决方案

    链接:https://www.jianshu.com/p/ca0bbb403143來源:简书 在使用Xcode9.2适配iPhone X的过程中遇到了部分图片显示异常(不显示或花掉)的问题.主要分两种 ...

  10. 【微信小程序项目实践总结】30分钟从陌生到熟悉 web app 、native app、hybrid app比较 30分钟ES6从陌生到熟悉 【原创】浅谈内存泄露 HTML5 五子棋 - JS/Canvas 游戏 meta 详解,html5 meta 标签日常设置 C#中回滚TransactionScope的使用方法和原理

    [微信小程序项目实践总结]30分钟从陌生到熟悉 前言 我们之前对小程序做了基本学习: 1. 微信小程序开发07-列表页面怎么做 2. 微信小程序开发06-一个业务页面的完成 3. 微信小程序开发05- ...