miniprogrampatch 提供 watch 和 computed 特性
推荐一个小程序补丁 github:miniprogrampatch,为你的 Page 和 Component 增加 watch 和 computed 特性。
安装
通过 npm 安装:npm install --save miniprogrampatch。
或者直接拷贝 miniprogrampatch.js 到项目中。
用法
miniprogrampatch.js 非常简单,它只有两个函数 patchPage 和 patchComponent。
假定你的项目目录结构如下:
- 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:- 如果
value为function,函数计算结果即为属性值。 - 如果
value为plain 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 特性的更多相关文章
- Spring Boot提供的特性
一.导览 本文主要按以下模块介绍spring Boot(1.3.6.RELEASE)提供的特性. SpringApplication类 外部化配置 Profiles 日志 开发WEB应用 Securi ...
- Javascript面向对象特性实现封装、继承、接口详细案例——进级高手篇
Javascript面向对象特性实现(封装.继承.接口) Javascript作为弱类型语言,和Java.php等服务端脚本语言相比,拥有极强的灵活性.对于小型的web需求,在编写javascript ...
- (转)C++0x语言新特性一览
转自:http://blog.csdn.net/zwvista/article/details/2429781 原文请见http://en.wikipedia.org/wiki/C%2B%2B0x. ...
- 使用Modernizr探测HTML5/CSS3新特性(转载)
转载地址:http://www.cnblogs.com/TomXu/archive/2011/11/18/detecting-html5-css3-features-using-modernizr.h ...
- 黑马程序员——【Java高新技术】——JDK1.5新特性:静态导入、可变参数、增强型for循环、自动装箱拆箱、枚举
---------- android培训.java培训.期待与您交流! ---------- 一.静态导入 1.import和import static区别: (1)import 是导入一个类或某个包 ...
- Orchard内置特性(以模块来说的)
本文链接:http://www.cnblogs.com/souther/p/4539169.html 主目录 Orchard中有很多可以直接和多次使用的特性,这些东西在官方的Gallery中可以找到. ...
- 使用Modernizr探测HTML5/CSS3新特性
[转] HTML5, CSS3以及相关技术(例如canvas和web sockets)带来了非常有用的特性,可以让我们的web程序提升一个新的level.这些新技术允许我们只用HTML,CSS和Jav ...
- 【转载】《Ext JS 4 First Look》翻译之一:新特性
免责声明: 本文转自网络文章,转载此文章仅为个人收藏,分享知识,如有侵权,请联系博主进行删除. 原文作者:^_^肥仔John 原文地址:http://www.cnblogs. ...
- Servlet 3.0 新特性
Servlet 3.0 作为 Java EE 6 规范体系中一员,随着 Java EE 6 规范一起发布.该版本在前一版本(Servlet 2.5)的基础上提供了若干新特性用于简化 Web 应用的开发 ...
随机推荐
- 新浪SAE创建微信模板消息应用与SVN的使用
本地项目源文件必须放在应用名目录下面的数字目录里面.如:D:\SVN\xtmp1\1 我们在前面讲述在新浪SAE中如何建站,今天我们来详解如何上传文件.新浪SAE中是不允许用FTP来上传的.我们只能用 ...
- UltraEdit使用(工具类似于notepad++)
打开多个文件,在多个文件中切换,鼠标点/ Ctrl+Tab自动换行的设置: 高级-->配置-->编辑器-->自动换行,制表符设置-->默认为每个文件启用自动换行 去掉自动备份设 ...
- 宿主机系统 Deepin 15.4,解决 Virtualbox 5.1 中 XP虚拟机无法使用 USB设备(如:U盘、罗技优联接收器等)的问题
软件环境 宿主机系统:Deepin 15.4.1, 虚拟机软件:VirtualBox 5.1 虚拟机系统:XP 操作步骤如下: (1) 安装 Virtualbox Extension Pack 进入 ...
- .net core使用数据库
.net core使用数据库 .net core 通过可以通过ef core或其它ORM框架进行数据访问.此处使用EF和Dapper作为示例. 使用EF Core访问数据库 与 .NET Framew ...
- PHP 使用POST 获取不到部分数据问题
使用PHP开发的一个项目,在测试阶段客户反馈说数据没有保存成功 而我之前测试是通过的,但按客户的信息上却重现了问题 问题是这样的 客户通过浏览器进行保存,但有些数据已经保存成功,但某些数据却没有保存成 ...
- from __future__ import print_function的作用
阅读代码的时候会看到下面语句: from __future__ import print_function 该语句是python2的概念,那么python3对于python2就是future了,也就是 ...
- TableView 无数据时展示占位视图
UITableView+NoDataView.m #import "UITableView+NoDataView.h" #import "NoDataView.h&quo ...
- sql中的left join以及on、where关键字的区别
创建两张表并插入一些数据 create table class( class_id int, class_name ), class_grade ) ); ,'语文','A'); ,'数学','B') ...
- SQL获取当前时间月份为两位数
--获取当前时间月份为两位数 )),) --获取当前时间上月月份为两位数 , )),)
- Python之string
1.string模块支持哪些字符形式?分别是什么. string支持的字符形式有: ('_re', '====>', <module 're' from 'C:\Python25\lib\ ...