微信小程序分析

创作星球 2017-11-02

微信小程序分析

框架

1.框架提供了自己的视图层描述语言WXML(描述页面的结构)和WXSS(描述页面的样式),以及基于JavaScript(逻辑处理)的逻辑层框架

2.在视图层与逻辑层间提供了数据传输(进行数据)和事件系统,可以让开发者可以方便的聚焦于数据与逻辑上。

3.整个系统分为两块视图层(View)和逻辑层(AppService)

4.框架可以让数据与视图非常简单地保持同步。当做数据修改的时候,只需要在逻辑层修改数据,视图层就会做相应的更新。

5.框架提供丰富的微信原生API,可以方便的调起微信提供的能力,如获取用户信息,本地存储,支付功能等。

6.框架管理了整个小程序的页面路由,可以做到页面间的无缝切换,并给以页面完整的生命周期。开发者需要做的只是将页面的数据,方法,生命周期函数注册进框架中,其他的一切复杂的操作都交由框架处理。

7.框架提供了一套基础的组件,这些组件自带微信风格的样式以及特殊的逻辑,开发者可以通过组合基础组件,创建出强大的微信小程序。

文件结构

1.小程序包含一个描述整体程序的app和多个描述各自页面的page。

2.一个小程序主体部分由三个文件组成,必须放在项目的根目录,

app.js//小程序逻辑

app.json//小程序公共设置

app.wxss//小程序公共样式表

3.一个框架页面由四个文件组成

js//页面逻辑

wxml//页面结构

wxss//页面样式表

json//页面配置

注意:为了方便开发者减少配置项,我们规定描述页面的这四个文件必须具有相同的路径与文件名。

app.json分析

{

//设置页面路径

//每一项代表对应页面的【路径+文件名】信息,数组的第一项代表小程序的初始页面。小程序中新增/减少页面,都需要对pages数组进行修改。

//文件名不需要写文件后缀,因为框架会自动去寻找路径.json,.js,.wxml,.wxss的四个文件进行整合。

"pages":[

"pages/index/index",

"pages/logs/index"

],

//设置默认页面的窗口表现

//用于设置小程序的状态栏、导航条、标题、窗口背景色。

"window":{

"navigationBarTitleText":"Demo"

},

//设置底部tab的表现

//如果我们的小程序是一个多tab应用(客户端窗口的底部有tab栏可以切换页面),那么我们可以通过tabBar配置项指定tab栏的表现,以及tab切换时显示的对应页面。

//1.当设置position为top时,将不会显示icon

//2.tabBar是一个数组,只能配置最少2个、最多5个tab,tab按数组的顺序排序。

"tabBar":{//设置底部tab的表现

"list":[{

"pagePath":"pages/index/index",

"text":"首页"

},{

"pagePath":"pages/logs/logs",

"text":"日志"

}]

},

//可以设置各种网络请求的超时时间。

"networkTimeout":{//设置网络超时时间

"request":10000,

"downloadFile":10000

},

//可以在开发者工具中开启debug模式,在开发者工具的控制台面板,调试信息以info的形式给出,其信息有Page的注册,页面路由,数据更新,事件触发。可以帮助开发者快速定位一些常见的问题。

"debug":true//设置是否开启debug模式

}

逻辑层(AppService)

1.每个页面有独立的作用域,并提供模块化能力。

2.由于框架并非运行在浏览器中,所以JavaScript在web中一些能力都无法使用,如document,window等。

注册程序App()函数

App()函数用来注册一个小程序。接受一个object参数,其指定小程序的生命周期函数等。

小程序运行的时候会加载这个文件,表示这个小程序的实例

全局的getApp()函数,可以获取到小程序实例。//在页面的js文件中,可以用这个函数得到这个小程序实例,有了实例就可以访问实例里的相关数据

varappInstance=getApp()

console.log(appInstance.globalData)//Iamglobaldata

注意:

App()必须在app.js中注册,且不能注册多个。

不要在定义于App()内的函数中调用getApp(),使用this就可以拿到app实例。

不要在onLaunch的时候调用getCurrentPage(),此时page还没有生成。

通过getApp()获取实例之后,不要私自调用生命周期函数。

注册页面Page()函数,就是小程序实例读取这个文件,向这个实例里注册一个页面。

Page()函数用来注册一个页面。

Page.prototype.route

route字段可以获取到当前页面的路径。

Page.prototype.setData()

setData函数用于将数据从逻辑层发送到视图层,同时改变对应的this.data的值。

页面路由

在小程序中所有页面的路由全部由框架进行管理。

getCurrentPages()

getCurrentPages()函数用于获取当前页面栈的实例,以数组形式按栈的顺序给出,第一个元素为首页,最后一个元素为当前页面。

模块化

在JavaScript文件中声明的变量和函数只在该文件中有效;不同的文件中可以声明相同名字的变量和函数,不会互相影响。

通过全局函数getApp()可以获取全局的应用实例,如果需要全局的数据可以在App()中设置,

我们可以将一些公共的代码抽离成为一个单独的js文件,作为一个模块。模块只有通过module.exports或者exports才能对外暴露接口。

//common.js

functionsayHello(name){

console.log('Hello${name}!')

}

functionsayGoodbye(name){

console.log('Goodbye${name}!')

}

module.exports.sayHello=sayHello

exports.sayGoodbye=sayGoodbye

​在需要使用这些模块的文件中,使用require(path)将公共代码引入。

varcommon=require('common.js')

Page({

helloMINA:function(){

common.sayHello('MINA')

}

goodbyeMINA:function(){

common.sayGoodbye('MINA')

}

})

数据绑定

<view>{{message}}</view>//用{{}}

//page.js

Page({

data:{

message:'HelloMINA!'

}

})

<viewid="item-{{id}}"></view>//组件属性(需要在双引号之内)

<viewwx:if="{{condition}}"></view>//控制属性(需要在双引号之内)

<checkboxchecked="{{false}}"></checkbox>//关键字(需要在双引号之内)

三元运算

<viewhidden="{{flag?true:false}}">Hidden</view>

算数运算

<view>{{a+b}}+{{c}}+d</view>

逻辑判断

<viewwx:if="{{length>5}}"></view>

字符串运算

<view>{{"hello"+name}}</view>

数据路径运算

<view>{{object.key}}{{array[0]}}</view>

相关推荐