Github地点
以下装置都经由历程npm
装置
装置 wepy 命令行东西。
npm install wepy-cli -g
在开辟目次天生开辟DEMO。
wepy new myproject
开辟及时编译。
wepy build --watch
dist
node_modules
src
components
com_a.wpy
com_b.wpy
pages
index.wpy
page2.wpy
app.wpy
package.json
运用微信开辟者东西
新建项目,当地开辟挑选dist
目次。
微信开辟者东西
–> 项目 –> 封闭ES6转ES5。
当地项目根目次运转wepy build --watch
,开启及时编译。
变量与要领运用只管运用驼峰式定名,防止运用$
开首。
以$
开首的要领或许属性为框架内建要领或许属性,能够被运用,运用前请[参考API文档]()。
进口,页面,组件的定名后缀为.wpy
。外链的文件能够是别的后缀。
请参考wpy文件申明
运用ES6语法开辟。
框架在ES6下开辟,因而也须要运用ES6开辟小递次,ES6中有大批的语法糖能够让我们的代码越发简约高效。
运用Promise
框架默许对小递次供应的API全都举行了 Promise 处置惩罚,以至能够直接运用async/await
等新特征举行开辟。
在原有的小递次的开辟形式下举行再次封装,更贴近于现有MVVM框架开辟形式。框架在开辟历程当中参考了一些如今框架的一些特征,而且融入个中,以下是运用wepy前后的代码对照图。
官方DEMO代码:
//index.js
//猎取运用实例
var app = getApp()
Page({
data: {
motto: 'Hello World',
userInfo: {}
},
//事宜处置惩罚函数
bindViewTap: function() {
console.log('button clicked')
},
onLoad: function () {
console.log('onLoad')
}
})
基于wepy的完成:
import wepy from 'wepy';
export default class Index extends wepy.page {
data = {
motto: 'Hello World',
userInfo: {}
};
methods = {
bindViewTap () {
console.log('button clicked');
}
};
onLoad() {
console.log('onLoad');
};
}
拜见章节:组件
示例代码:
// index.wpy
在编译历程当中,会递归遍历代码中的require
然后将对应依靠文件从node_modules当中拷贝出来,而且修正require
为相对途径,从而完成对外部NPM包的支撑。以下图:
官方目次构造要求app必需有三个文件app.json
,app.js
,app.wxss
,页面有4个文件 index.json
,index.js
,index.wxml
,index.wxss
。而且文件必需同名。
所以运用wepy开辟前后开辟目次对照以下:
官方DEMO:
project
pages
index
index.json
index.js
index.wxml
index.wxss
log
log.json
log.wxml
log.js
log.wxss
app.js
app.json
app.wxss
运用wepy框架后目次构造:
project
src
pages
index.wpy
log.wpy
app.wpy
用户能够经由历程修正.wepyrc
设置文件,设置自身熟习的babel环境举行开辟。默许开启运用了一些新的特征如promise
,async/await
等等。
示例代码:
import wepy from 'wepy';
export default class Index extends wepy.page {
getData() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve({data: 123});
}, 3000);
});
};
async onLoad() {
let data = await this.getData();
console.log(data.data);
};
}
对如今API举行promise处置惩罚,同时修复一些现有API的缺点,比方:wx.request并发题目等。
原有代码:
OnLoad= function () {
var self = this;
wx.login({
success: function (data) {
wx.getUserInfo({
success: function (userinfo) {
self.setData({userInfo: userinfo});
}
});
}
});
}
基于wepy完成代码:
async onLoad() {
await wx.login();
this.userInfo = await wx.getUserInfo();
}
在同时并发10个request要求测试时:
不运用wepy:
运用wepy后:
实行wepy new demo
后,会天生相似设置文件。
{
"wpyExt": ".wpy",
"sass": {},
"less": {},
"babel": {}
}
wpyExt:缺省值为’.wpy’,IDE默许情况下不会对此文件范例高亮,此时能够修正一切文件为.vue
后缀(由于与vue高亮划定规矩一样),然后将此选项修正为.vue
,就可以处理部份IDE代码高亮题目。
sass:sass编译设置,拜见这里。
less:less编译设置,拜见这里。
babel:babel编译设置,拜见这里。
wpy
文件的编译历程过下:
一个.wpy
文件分为三个部份:
款式对应原有
wxss
。
模板对应原有
wxml
。
代码对应原有
js
。
个中进口文件app.wpy
不须要template
,所以编译时会被疏忽。这三个标签都支撑type
和src
属性,type
决议了其代码编译历程,src
决议是不是外联代码,存在src
属性且有用时,疏忽内联代码,示例以下:
标签对应 type
值以下表所示:
标签 | type默许值 | type支撑值 |
---|---|---|
style | css | css ,less ,sass(待完成) |
template | wxml | wxml ,xml ,html(待完成) |
script | js | js ,TypeScript(待完成) |
进口app.wpy
继续自wepy.app
,包含一个config
属性和其全局属性、要领、事宜。个中config
属性对应原有的app.json
,编译时会依据config
天生app.json
文件,假如须要修正config
中的内容,请运用体系供应API。
页面进口继续自wepy.page
,重要属性申明以下:
属性 | 申明 |
---|---|
config | 页面config,相当于本来的index.json,同app.wpy 中的config |
components | 页面引入的组件列表 |
data | 页面须要衬着的数据 |
methods | wmxl的事宜捕获,如bindtap ,bindchange |
events | 组件之间经由历程broadcast ,emit 通报的事宜 |
别的 | 如onLoad ,onReady 等小递次事宜以及别的自定义要领与属性 |
页面进口继续自wepy.component
,属性与页面属性一样,除了不须要config
以及页面特有的一些小递次事宜等等。
小递次支撑js模块化援用,也支撑wxml模板,但相互自力,营业代码与交互事宜仍需在页面处置惩罚。没法完成组件化的松耦合与复用的结果。
比方模板A中绑定一个bindtap="myclick"
,模板B中一样绑定一样bindtap="myclick"
,那末就会影响统一个页面事宜。关于数据一样云云。因而只要经由历程转变变量或许事宜要领,或许给其加差别前缀才完成绑定差别事宜或许差别数据。当页面庞杂以后就非常不利于开辟保护。
因而wepy让小递次支撑组件化开辟,组件的一切营业与功能在组件自身完成,组件与组件之间相互断绝,上述例子在wepy的组件化开辟历程当中,A组件只会影响到A绑定的myclick
,B也云云。
当页面或许组件须要引入子组件时,须要在页面或许script
中的components
给组件分派唯一id,而且在template
中增加
标签,如index.wpy。
页面和组件都能够引入子组件,引入多少组件后,以下图:
Index页面引入A,B,C三个组件,同时组件A和B又有自身的子组件D,E,F,G,H。
wepy.component
基类供应三个要领$broadcast
,$emit
,$invoke
,因而任一页面或任一组件都能够挪用上述三种要领完成通讯与交互,如:
$this.$emit('some-event', 1, 2, 3, 4);
组件的事宜监听须要写在events
属性下,如:
import wepy form 'wepy';
export default class Com extends wepy.component {
compOnents= {};
data = {};
methods = {};
events = {
'some-event': ($event, ...args) {
console.log(`${this.name} receive ${$event.name} from ${$event.source.name}`);
}
};
// Other properties
}
$broadcast$broadcast
事宜是由父组件提议,一切子组件都邑收到此播送事宜,除非事宜被手动作废。事宜播送的递次为广度优先搜刮递次,如上图,假如Page_Index
提议一个$broadcast
事宜,那末吸收到事宜的先后递次为:A, B, C, D, E, F, G, H。以下图:
$emit$emit
与$broadcast
恰好相反,事宜提议组件的父组件会顺次吸收到$emit
事宜,如上图,假如E提议一个$emit
事宜,那末吸收到事宜的先后递次为:A, Page_Index。以下图:
$invoke$invoke
是一个组件对另一个组件的直接挪用,经由历程传入的组件途径找到响应组件,然后再挪用其要领。
假如想在Page_Index
中挪用组件A的某个要领:
this.$invoke('ComA', 'someMethod', 'someArgs');
假如想在组件A中挪用组件G的某个要领:
this.$invoke('./../ComB/ComG', 'someMethod', 'someArgs');
小递次经由历程Page
供应的setData
要领去绑定数据,如:
this.setData({title: 'this is title'});
由于小递次架构自身缘由,页面衬着层和JS逻辑层离开的,setData操纵现实就是JS逻辑层与页面衬着层之间的通讯,那末假如在统一次运转周期内屡次实行setData
操纵时,那末通讯的次数是一次照样屡次呢?这个取决于API自身的设想。
wepy运用脏数据检核对setData举行封装,在函数运转周期结束时实行脏数据搜检,一来能够不必体贴页面屡次setData是不是会有性能上的题目,二来能够越发简约去修正数据完成绑定,不必反复去写setData要领。代码以下:
this.title = 'this is title';
但需注意,在函数运转周期以外的函数里去修正数据须要手动挪用$apply
要领。如:
setTimeout(() => {
this.title = 'this is title';
this.$apply();
}, 3000);
在实行脏数据搜检是,会经由历程this.$$phase
标识当前搜检状况,而且会保证在并发的流程当中,只会有一个脏数据搜检流程在运转,以下是实行脏数据搜检的流程图:
点这里检察官方文档
// 官方
wx.request({
url: 'xxx',
success: function (data) {
console.log(data);
}
});
// wepy 运用体式格局
// request 接口从只吸收Object变成可吸收String
wx.request('xxxx').then((d) => console.log(d));
点这里检察官方文档
// 官方
Page({
tapName: function(event) {
console.log(event.currentTarget.hi)// output: WeChat
}
});
// wepy 发起传参体式格局
events: {
tapName (event, id, title, other) {
console.log(id, title, other)// output: 1, wepy, something
}
}
保存setData要领,但不发起运用setData实行绑定,修复传入undefined
的bug,而且修正入参支撑:this.setData(target, value)
this.setData(object)
点这里检察官方文档
// 官方
onLoad: function () {
this.setData({message: 'hello world'});
}
// wepy
onLoad () {
this.message = 'hello world';
}
点这里检察官方文档
// 官方
var item = require('item.js')
// wepy
|父类 | 无 |
| —- | —- |
属性 | 范例 | 默许值 | 申明 |
---|---|---|---|
name | String | – | 事宜称号 |
source | wepy.component | – | 事宜泉源 |
type | String | – | emit 或许 broadcast |
要领 | 参数 | 返回值 | 申明 |
---|---|---|---|
destroy | – | – | 在 emit 或许 broadcast 历程当中,挪用destroy要领将会住手事宜流传。 |
父类 | 无 |
---|
属性 | 范例 | 默许值 | 申明 |
---|---|---|---|
isComponent | Boolean | true | 是不是是组件,假如是页面,此值为false |
prefix | String | ” | 组件前缀,组件前缀+组件要领属性才是在小递次中实在存在的要领或属性。 |
$root | wepy.page | – | 根组件,平常都是页面 |
$parent | wepy.component | – | 父组件 |
$wxpage | Page | – | 小递次Page对象 |
$coms | List(wepy.component) | {} | 子组件列表 |
要领 | 参数 | 返回值 | 申明 |
---|---|---|---|
init | – | – | 组件初始化。 |
getWxPage | – | Page | 返回小递次Page对象。 |
$getComponent | path(String) | wepy.component | 经由历程组件途径返回组件对象。 |
$invoke | com(String/wepy.component), method(String), [args] | – | 挪用别的组件要领 |
$broadcast | evtName(String), [args] | – | broadcast事宜。 |
$emit | evtName(String), [args] | – | emit事宜。 |
$apply | fn(Function) | – | 预备实行脏数据搜检。 |
$digest | – | – | 脏搜检。 |
父类 | wepy.component |
---|
属性 | 范例 | 默许值 | 申明 |
---|
要领 | 参数 | 返回值 | 申明 |
---|---|---|---|
init | – | – | 页面始化。 |
父类 | 无 |
---|
属性 | 范例 | 默许值 | 申明 |
---|---|---|---|
$wxapp | App | – | 小递次getApp() |
init | – | – | 运用始化包含对原生API的革新与优化 |