1.wepy组件的编译

wepy中使用一个组件时候,需要先引用(import)。再在需要使用该组件的页面(或组件)中声明。例如:

import Counter from '/path/to/Counter';
components = {
  counter1: Counter,
counter2: Counter
}

引入一个组件要出现在多处分别使用时,需要为组件分配不同的id,此处分别为counter1,counter2。

如果Counter组件模板

<view>{{counter}}</view>

则编译后的counter1内容在其引用的页面中的样子为:

<view>{{$counter1$counter}}</view>

编译后的counter2内容为

<view>{{$counter2$counter}}</view>

2.wepy组件中的setData

wepy通过在函数运行周期结束时候,进行脏值检查,以便使用者可以不用手动setData更新视图。

但是在组件中,由于组件被编译成了$prefix$value的形式,即组件中定义的data,无法直接通过this.setData({key:value})形式去更新。

如果需要手动调用this.setData({key: value});需要这样使用-> this.setData({this.$prefix+key: value});

用上面的Counter组件为例:

  export default class Counter extends wepy.component {
data = {
counter: 1
}
  
onload() {
// 正确
    this.setData({this.prefix+'counter': 2});
    this.data = 2; //setData 完要记得更新counter中的值。
    // 错误
    this.setData({counter: 2});
}
}

应用场景:脏值检查时候由于值未更新,所以不会自动触发setData去更新(脏值检查会在合适时触发setData)。有时候需要特殊的效果

比如focus文本框,此时文本框已经失去了焦点,但是控制文本框焦点的变量值仍为true。此时想要让文本框再次获得焦点,setData一下。

3.wepy对于wx.xxx一系列的promise化

 // 原生代码:
wx.request({
url: 'xxx',
success: function (data) {
console.log(data);
}
}); // WePY 使用方式
wepy.request('xxxx').then((d) => console.log(d));

原生代码中需要将成功回调作为参数传入request,wepy中可以通过promise的用法使用。

其中核心的代码如下:

其中obj为传入函数的参数。

翻译一下这段代码就是:

var wx = {
getStorage: function(config) {
// 如果异步事情搞定:
if(ok) {
config.success(res);
} else {
config.error({err:'错误'});
}
}
} //使用
wx.getStorage({
success: (res)=> {},
error: (err) => {}
}); // promisify
Object.defineProperties(wx, 'getStorage', {
get() {
// get函数,则返回函数
// obj为传入函数的参数
return (obj) => {
obj = obj || {};
var p = new Promise((okFn, errFn) => {
const oldHandler = {};
oldHandler['success'] = obj.success;
oldHandler['failed'] = obj.failed;
// 成功的话,resolve这个promise。
obj.success = (res) => {
okFn(res);
}
// 失败的话reject这个promise。
obj.error = (err) => {
errFn(err);
};
// 调用这个函数
wx.getStorage(obj);
});
// 返回这个promise
return p;
}
}
})

4.wepy对请求队列的优化

原生的小程序对并发的请求有最大个数限制是10个。也就是说一次发送11个请求就会报错。

wepy对其进行了优化,其核心代码如下:

import native from './native';

let RequestMQ = {
map: {},
mq: [],
running: [],
MAX_REQUEST: 5,
push (param) {
param.t = +new Date();
while ((this.mq.indexOf(param.t) > -1 || this.running.indexOf(param.t) > -1)) {
param.t += Math.random() * 10 >> 0;
}
this.mq.push(param.t);
this.map[param.t] = param;
},
next () {
let me = this; if (this.mq.length === 0)
return; if (this.running.length < this.MAX_REQUEST - 1) {
let newone = this.mq.shift();
let obj = this.map[newone];
let oldComplete = obj.complete;
obj.complete = (...args) => {
me.running.splice(me.running.indexOf(obj.t), 1);
delete me.map[obj.t];
oldComplete && oldComplete.apply(obj, args);
me.next();
}
this.running.push(obj.t);
return wx.request(obj);
}
},
request (obj) { obj = obj || {};
obj = (typeof(obj) === 'string') ? {url: obj} : obj; this.push(obj); return this.next();
}
};

核心思想为,维护一个等待队列和一个执行中队列。如果有请求过来,先放到等待队列,然后判断执行队列中任务数是否达到最大,未达到最大则从等待队列取出任务放到执行队列执行。一旦执行队列有任务执行完成。则进行新一轮的检查\执行。

05——wepy框架中的一些细节的更多相关文章

  1. php json_encode在CI框架中的使用细节

    这个错误的造成原因是加载类类库,转换成json格式的时候不熟悉CI框架的规定导致的,CI框架中规定在将数据转换成json格式的时候需要将类库小写,当然了,调用的时候必须保证有这个类库,且可以在对应的文 ...

  2. WePy框架的使用

    基本示例 import wepy from 'wepy';//引入wepy框架说明 // 通过继承自wepy.page的类创建页面逻辑 export default class Index exten ...

  3. 【转】【译】JavaScript魔法揭秘--探索当前流行框架中部分功能的处理机制

    推荐语: 今天推荐一篇华为同事的同事翻译的一篇文章,推荐的主要原因是作为一个华为员工居然晚上还能写文章,由不得小钗不佩服!!! 其中的jQuery.angular.react皆是十分优秀的框架,各有特 ...

  4. Web API应用架构在Winform混合框架中的应用(3)--Winfrom界面调用WebAPI的过程分解

    最近一直在整合WebAPI.Winform界面.手机短信.微信公众号.企业号等功能,希望把它构建成一个大的应用平台,把我所有的产品线完美连接起来,同时也在探索.攻克更多的技术问题,并抽空写写博客,把相 ...

  5. Web API应用架构在Winform混合框架中的应用(1)

    在<Web API应用架构设计分析(1)>和<Web API应用架构设计分析(2)>中对WebAPI的架构进行了一定的剖析,在当今移动优先的口号下,传统平台都纷纷开发了属于自己 ...

  6. 详解Java的MyBatis框架中SQL语句映射部分的编写

    这篇文章主要介绍了Java的MyBatis框架中SQL语句映射部分的编写,文中分为resultMap和增删查改实现两个部分来讲解,需要的朋友可以参考下 1.resultMap SQL 映射XML 文件 ...

  7. iOS开发概述UIkit动力学,讲述UIKit的Dynamic特性,UIkit动力学是UIkit框架中模拟真实世界的一些特性。

    转发:http://my.oschina.net/u/1378445/blog/335014 iOS UIKit动力学 Dynamics UIAttachmentBehavior 实现iMessage ...

  8. Unity C# 多态 委托 事件 匿名委托 Lambda表达式 观察者模式 .NET 框架中的委托和事件

    一.多态 里氏替换原则: 任何能用基类的地方,可以用子类代替,反过来不行.子类能够在基类的基础上增加新的行为.面向对象设计的基本原则之一. 开放封闭原则: 对扩展开放,意味着有新的需求或变化时,可以对 ...

  9. 像VUE一样写微信小程序-深入研究wepy框架

    像VUE一样写微信小程序-深入研究wepy框架 微信小程序自发布到如今已经有半年多的时间了,凭借微信平台的强大影响力,越来越多企业加入小程序开发. 小程序于M页比相比,有以下优势: 1.小程序拥有更多 ...

随机推荐

  1. (一) ffmpeg filter学习-使用流程

    FFMPEG中有一个类库:libavfilter.该类库提供了各种视音频过滤器.之前一直没有怎么使用过这个类库,最近看了一下它的使用说明,发现还是很强大的,有很多现成的filter供使用,完成视频的处 ...

  2. Cannot mix incompatible Qt library (version 0x40805) with this library (version 0x40801)

    问题描述 今天运行我的 linux 上的 go 语言 IDE liteide 突然报错,错误如下: Cannot mix incompatible Qt library (version 0x4080 ...

  3. 从JDK源码角度看Boolean

    Java的Boolean类主要作用就是对基本类型boolean进行封装,提供了一些处理boolean类型的方法,比如String类型和boolean类型的转换. 主要实现源码如下: public fi ...

  4. 产生num个不重复的随机数组

    createDiffRandom : function (from,to,num) { // 产生num个不重复的随机数组 var arr=[],json={}; // 随机数数组 , 标记json对 ...

  5. 05-python中函数的使用

    函数:就是让程序模块化,把具有独立功能的代码块当成一个整体封装成一个函数 首先打印一个佛主看看: print(" _ooOoo_ ") print(" o8888888o ...

  6. golang slice 与list 的性能分析。

    一 · 比较slice 与 list 遍历创建和添加元素速度. package main import ( "time" "fmt" "contain ...

  7. from sklearn.datasets import make_classification创建分类数据集

    make_classification创建用于分类的数据集,官方文档 例子: ### 创建模型 def create_model(): # 生成数据 from sklearn.datasets imp ...

  8. 线性回归 Linear regression(2)线性回归梯度下降中学习率的讨论

    这篇博客针对的AndrewNg在公开课中未讲到的,线性回归梯度下降的学习率进行讨论,并且结合例子讨论梯度下降初值的问题. 线性回归梯度下降中的学习率 上一篇博客中我们推导了线性回归,并且用梯度下降来求 ...

  9. bzoj 5334 数学计算

    bzoj 5334 数学计算 开始想直接模拟过程做,但模数 \(M\) 不一定为质数,若没有逆元就 \(fAKe\) 掉了. 注意到操作 \(2\) 是删除对应的操作 \(1\) ,相当于只有 \(1 ...

  10. BZOJ2002 Hnoi2010 Bounce 弹飞绵羊 【LCT】【分块】

    BZOJ2002 Hnoi2010 Bounce 弹飞绵羊 Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始, ...