微信小程序,简称小程序,英文名Mini Program,是一种不需要下载安装即可使用的应用,它实现了应用“触手可及”的梦想,用户扫一扫或搜一下即可打开应用。小程序是一种不用下载就能使用的应用,也是一项门槛非常高的创新,经过将近两年的发展,已经构造了新的小程序开发环境和开发者生态。
由于身处于在线旅游行业,对OTA的行业动态都比较关心一些,前阵子研究体验了一下艺龙的微信小程序,虽然有些美中不足,但是小程序的
架构组件还是非常好的,所以今天我们就来简单看看艺龙微信小程序
框架组件。
首先,我们将艺龙微信小程序的框架组件分为以下四个部分来分析:
1.局部组件
2.独立组件
3.集成组件
4.网络请求
先看三张的动态效果图:
总体而言,其
目录结构如下:
[AppleScript] 纯文本查看 复制代码
├── README.MD
├── app.js
├── app.json
├── app.wxss
├── components
├── image
├── pages
├── service
└── utils
├── api.js
├── cookie.js
├── data-center.js
├── overwrite.js
├── page-events.js
├── path.js
├── promise.js
└── service.js
框架使用说明
[AppleScript] 纯文本查看 复制代码
//index.js
var api = require("./utils/api.js")();
api.login({
success: function(res) {
console.log(res);
}
});[AppleScript] 纯文本查看 复制代码
//index.js
var api = require("./utils/api.js")();
api.login({
success: function(res) {
console.log(res);
}
});
[AppleScript] 纯文本查看 复制代码
//demo.js
var Service = require("../utils/service.js");
module.exports = {
GetTime: Service({
url: 'https://xxx.xxx.xxx/api/getserverdate/',
params: [], //参数列表
method: 'GET',
noLoading: true,
mockData: function() { //模拟数据
return new Date();
},
dataTransform: function(data) { //适配处理
return data;
}
})
};[AppleScript] 纯文本查看 复制代码
//index.js
var service = require('service/demo'); //框架约定,所有的后端接口,要注册到对应的service文件中
var serverDate = service.GetTime( /*service可配置参数列表,这里传入相对应的参数*/ ).then(function(date) {
that.setData({
serverDate: date
});
});
[AppleScript] 纯文本查看 复制代码
//index.js
var COOKIE = require('./cookie.js');
var expire = new Date().getTime() + res.expire * 1000;
COOKIE.set(key, value, expire);[AppleScript] 纯文本查看 复制代码
//service.js
//...
headers["Cookie"] = Cookie.getAll(); //用户cookie将随http请求发送至服务器
//...
[AppleScript] 纯文本查看 复制代码
//微信小程序原生页面注册形式
Page({
data: {},
onLoad: function() {}
});
//框架重写注册形式
var dirname = 'pages/index',
overwrite = require('../../utils/overwrite.js');
(function(require, Page) { //重写require、Page
Page({
data: {},
onLoad: function() {}
});
})(overwrite.require(require, dirname), overwrite.Page);
[AppleScript] 纯文本查看 复制代码
//index.js
var dirname = 'pages/index',
overwrite = require('../../utils/overwrite.js');
(function(require, Page) {
//获取应用实例
var app = getApp();
var service = require('service/demo');
Page({
data: {
indate: '',
indateText: ''
},
onLoad: function() {
this.listenerGlobalData('indate', function(indate) {
this.data.indate = indate
this.data.indateText = new Date(indate).format('MM-dd')
}.bind(this));
}
})
})(overwrite.require(require, dirname), overwrite.Page);
[AppleScript] 纯文本查看 复制代码
//index页面
var event = api.Navigate.go({
url: '../list/index',
params: {
name: 'billy'
}
});
event.on("listok", function(params) {
console.log(params);
});[AppleScript] 纯文本查看 复制代码
//http页面
Page({
onLoad: function(data) {
if (data.name === 'billy') {
this.fireEvent("listok", 'hello ' + data.name);
}
}
});组件使用说明
框架重写Page构造方法,内置了一些常用的组件,例如 alert、picker、setLoading,其中 alert 和 setLoading 内部分别封装了原生的 wx.showModal 、wx.showToast,封装使得调用参数结构化,方便业务使用,使用时不用引入页面结构,直接调用即可;picker则需要首先引入到页面中表现层结构,按照配置要求传递配置项。
[AppleScript] 纯文本查看 复制代码
//setLoading
this.setLoading(true);//ture/false
//picker 引入表现层结构
<!--index.wxml-->
<view class="container">
<view class="userinfo">
<text class="userinfo-nickname">{{current}}</text>
</view>
<include src="../../components/base.wxml" />
</view>
//picker 使用
overwrite.picker({
content: "选择排序",
init: this.data.sortIndex,
data: this.data.sortList,
bindtap: function(id, index) {
if (that.data.sort != id) {
that.setData({
sortIndex: index,
current: this.data.sortList[index].text
});
}
},
bindcancel: function() {
console.log('cancel')
}
});
//alert
overwrite.alert({
content: '弹框对话框,参数配置详见文档说明',
cancelText: '取消',
bindconfirm: function() {
console.log('确定');
},
bindcancel: function() {
console.log('取消');
}
});
独立页面组件其实就是一个完整的页面单元(js、wxml、wxss组成),使用很简单,通过引入相关js方法,调用打开组件即可(可传递callback用于数据交换处理)。--其实现原理是组件提供的js方法将会打开一个新页面(api.Navigate.go),并通过注册事件的形式交互行为数据
[AppleScript] 纯文本查看 复制代码
//index.js
var dirname = 'pages/externalComponent',
overwrite = require('../../utils/overwrite.js');
require('../../utils/dateFormat.js');
(function(require, Page) {
//获取应用实例
var app = getApp();
var CalendarPlugin = require('components/calendar/index');
Page({
data: {
date: {
indate: new Date().format('yyyy-MM-dd'),
outdate: new Date(+new Date + 3600000 * 24).format('yyyy-MM-dd')
}
},
openCalendar: function() {
var that = this;
CalendarPlugin({
begin: that.data.date.indate,
end: that.data.date.outdate
}, function(res) {
that.data.date.indate = res.start.format('yyyy-MM-dd');
that.data.date.outdate = res.end.format('yyyy-MM-dd');
that.setData({
date: that.data.date
})
})
},
onLoad: function(data) {
}
})
})(overwrite.require(require, dirname), overwrite.Page);
框架重写Page构造器,支持构建页面时配置一个或多个页面级组件,所谓页面级组件就是该组件的注册形式和页面一致(支持data数据,onLoad、onReady、onShow生命周期事件,fireEvent、showLoading等页面级方法),其实现原理是将组件的所有成员方法和成员属性和依附页面进行合并,并解决了重名冲突,使用者不用关系处理细节,只管像注册一个页面一样注册组件。--需要注意的是页面级别组件不可再次使用Page构造方法。
1、引入组件表现层结构
[AppleScript] 纯文本查看 复制代码
<!--index.wxml-->
<view class="container">
<view class="userinfo">
<!--当前页面数据-->
</view>
<!--引入组件页面结构-->
<include src="../../components/base.wxml" />
</view>2、引入组件样式表
[AppleScript] 纯文本查看 复制代码
/**引入组件样式表**/
@import "filter/index.wxss";
page { background: #f4f4f4; }3、注册页面时注入组件
[AppleScript] 纯文本查看 复制代码
/**
* 集成组件dome
*/
var dirname = 'pages/internalComponent',
overwrite = require('../../utils/overwrite.js');
(function(require, Page) {
/*引入组件js*/
var filter = require('./filter/index');
Page({
/**
* 默认数据
* @type {Object}
*/
data: {...},
onLoad: function(options) {},
}, [{//注入组件
component: filter,
instanceName: 'typeFilter',
props: {
style: { top: '44px' }
},
events: {
onChange: 'filterChangedCallBack',
onOpen: 'filterOpenedCallBack',
onClose: 'filterClosedCallBack'
}
}, {
component: filter,
instanceName: 'categoryFilter',
props: {
style: { top: '44px' }
},
events: {
onChange: 'filterChangedCallBack',
onOpen: 'filterOpenedCallBack',
onClose: 'filterClosedCallBack'
}
}])
})(overwrite.require(require, dirname), overwrite.Page)页面级组件由*.js、*.wxml、*.wxss组成,分别由注册页面引入,其中js部分不可再次使用Page构造
[AppleScript] 纯文本查看 复制代码
├── index.js
├── index.wxml
└── index.wxss[AppleScript] 纯文本查看 复制代码
//页面级组件js声明
/**
* 筛选器
*/
var dirname = 'pages/internalComponent/filter',
api = require('../../../utils/api.js')(dirname)
var bgAnimation = api.createAnimation({
duration: 200
}),
contentAnimation = api.createAnimation({
duration: 200
});
module.exports = {
data: {
items: [],
selectedId: '',
bgAnimation: {},
contentAnimation: {},
isOpen: false
},
/**
* 监听组件加载
* @param {Object} props
*/
onLoad: function(props) {
this.setData({
style: props.style
})
},
/**
* 初始化
* @param {Array} items
* @param {String 关键词:艺龙微信小程序框架组件案例代码