微信小程序

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

跟普通项目区别:

  • (最多可以同时调用5个API,跳转5个页面,貌似目前上传项目大小为1M);
  • 文件后缀js -> js,html -> wxml, css -> wxss;
  • js: 小程序不支持dom和bom,所以js中目前不能出现js和其他引用的框架。但是写法和普通项目中的js类似,貌似js中有的功能也可以用,解码转码就可以。
  • wxml: wxml中的目前能用的标签为 view(div),image(img),text(span),input(text,number,idcard(身份证输入键盘),digit(带小数点的数字键盘),time,date,emoji(带表情的输入框),button,form,checkbox,radio,等。。。。目前去掉了h1-h6,ul,textarea(多行输入现在不能实现)。
  • wxss:
    • 以flex布局为主,大部分标签都可以用。选择器目前支持:class,id,element,:before,:after这几种(+ ~)目前不能用,weui中text-size-adjust: 100%;(是解决 iPhone 横屏时默认会放大文字的问题)没用;
    • 字体新增了rpx(responsive pixel;
      logo

像素跟分辨率的区别:
(PPI即每英寸所拥有的像素数目)
logo

*  支持样式导入 @import "common.wxss";

主程序包含:app.js,app.json,app.wxss;
logo

app.js:

App()函数用来注册一个小程序,在这个页面中监听并处理小程序的生命周期函数、声明全局变量;

1:小程序的生命周期函数,官方文档截图:

logo

2:声明全局变量:当在多个页面中公用一个变量时,可以在此声明全局变量。全局变量可被声明在页面中的

同名变量所代替。(就像css中*{}中的可被类或ID中的样式替换一样)
logo

app.json:

是对整个小程序的全局配置,包括路由,窗口背景色,导航条样式,默认标题。(此页面不可加注释)
logo
最多可以设置5个tabBar;
此外还包括networkTimeout:设置网络超时时间;debug:是否显示调试。
如果在各个页面中有json,会覆盖全剧中的app.json对应的内容(可以设置没个页面默认显示的标题等)

各个页面的js,wxml,wxss,json

js

Page()函数用来注册一个页面,指定页面的初始数据、生命周期函数、事件处理函数等;

页面的初始数据:

  • data数据数据必须是可以转成JSON的格式:字符串,数字,布尔值,对象,数组。

生命周期函数:
logo

  • onLoad:
    • 可以调用wx.request() (ajax);
    • 可传参数,参数就是其url中所带的参数值
      1
      2
      3
      4
      5
      6
      7
      8
      9
       <!-- 比如其url为http:baidu.com?d=8023y=xx -->
      onLoad: function (options) {
      console.log(options);
      }
      <!-- 打印出来为 -->
      {
      d: 8023,
      y: xx,
      }

事件处理函数

  • 每个函数都有其函数作用域,所以和普通js函数相似,得注意this问题。
1
2
<!-- 如同js的将事件直接绑定到元素上 -->
<view id="tapTest" data-hi="MINA" bindtap="tapName"> Click me! </view>
  • 事件分类
    没有click,只有bindtap(不阻止事件冒泡),catchtap(阻止事件冒泡)以及如图:
    logo
  • 事件对象
    打印出来为:
    logo
    以bindtap为例:
1
2
3
4
5
6
7
8
9
10
11
{<!-- 事件类型 -->
type: 'tap',
<!-- 生成时间的时间戳 -->
timeStamp: 2890,
<!-- 触发时间的组件的一些属性值集合,触发事件的源组件 -->
target: {},
<!-- 当前组件的一些属性值集合,事件绑定的当前组件 -->
currentTarget: {}
<!-- 额外的信息,可获取input的值 -->
detail: '',
}

logo

wxml 包括数据绑定、条件渲染、列表渲染、模版、引用、导航

  • 数据绑定:
    类似react和vue,使用大括号
1
<view> {{ message }} </view>
  • 条件渲染

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<view wx:if='{{ manageList.length == 0 }}'>
<view class = "weui__cells">
<view class = "weui__cell">
<text class = "weui-cell__bd middle"> 暂无成员 </text>
<text class = "weui-cell__ft"></text>
</view>
</view>
</view>
<view wx:elif = '{{}}'>
</view>
<view wx:else>
<block wx:for-items="{{ manageList }}">
<view class = "weui__cells" data-id = "{{ item.userId }}">
<view class = "weui__cell">
<image class = "personImg" src = "{{item.userHead}}" model = "aspectFill"></image>
<text class = "weui-cell__bd"> {{ item.userName }} </text>
<text class = "weui-cell__ft"></text>
</view>
</view>
</block>
</view>

  • 列表渲染
1
2
3
4
5
6
7
8
9
<block wx:for-items="{{ manageList }}">
<view class = "weui__cells" data-id = "{{ item.userId }}">
<view class = "weui__cell">
<image class = "personImg" src = "{{item.userHead}}" model = "aspectFill"></image>
<text class = "weui-cell__bd"> {{ item.userName }} </text>
<text class = "weui-cell__ft"></text>
</view>
</view>
</block>
  • 导航 (分为两种:是否关闭当前页面,默认不关闭)
    导航可写在wxml中,也可写在js中:
    • wxml:代码
1
2
3
4
5
6
7
8
<block wx:for-items="{{ actionSheetItems }}">
<!-- 如果加上redirect是关闭当前页面 -->
<navigator url = "../../components/{{ item.page }}/{{ item.page }}">
<!--<action-sheet-item class = "item" bindtap="bind{{ item }}">{{ item.name }}</action-sheet-item>-->
<!-- 从屏幕底部出现的弹框 -->
<action-sheet-item class = "item">{{ item.name }}</action-sheet-item>
</navigator>
</block>
*  js: 代码
1
2
3
4
5
6
7
8
<!-- 创建的群, -->
creatGroupVw: function (e) {
var dataset = e.currentTarget.dataset;
//wx.redirectTo是关闭当前页面
wx.navigateTo({
url: '../singleInfo/singleInfo?infoId='+dataset.id+'&createGroup=show',
});
}
  • 也支持模版和引用

wxss

  • 如果跟app.wxss重名可覆盖app.wxss里面的类名或id名

json

页面的.json只能设置window相关的配置项,以决定本页面的窗口表现,所以无需写window这个键

组件

  • 视图容器: view、scroll-view、swiper
    • scroll-view: 绑定bindscrolltoupper(滑动到顶部触发)、bindscrolltolower(滑动到底部触发)可实现下拉加载,上拉刷新(需给scroll-view设置固定的高度);
      下拉加载:
      定义一个全局变量数组;每次请求后将数据push进去。
    • swiper(轮播图)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!-- indicator-dots:是否显示面板指示点;autoplay:是否自动切换;current:当前所在页面的index
interval:自动切换时间间隔(5000);duration:滑动动画时长(1000);bindchange:
current改变时会触发change事件,event.detail={current:current} -->
<!-- 其中只可放置swiper-item组件,其他节点会被自动删除 -->
<swpier indicator-dots="{{indicatorDots}}"
autoplay="{{autoplay}}" interval="{{interval}}" duration="{{duration}}">
<block wx:for-items="{{imgUrls}}">
<swpier-item>
<image src="{{item}}" class="slide-image" width="355" height="150"/>
</swpier-item>
</block>
</swpier>
<button bindtap="changeIndicatorDots"> indicator-dots </button>
<button bindtap="changeAutoplay"> autoplay </button>

<slider bindchange="intervalChange" show-value min="500" max="2000"/> interval
<slider bindchange="durationChange" show-value min="1000" max="10000"/> duration

logo

  • 基础内容
1
2
3
4
5
6
<!-- icon type类型:success,success_no_circle,info,warn,waiting,cancel,download,search,clear
size控制大小,color:颜色 -->
<icon type="success" size="{{item}}" color="green"/>
<!-- 进度条:percent:百分比0~100;showInfo:在进度条右侧显示百分比;strokeWidth:进度条线的宽度,单位px
color:进度条颜色;active:进度条从左往右的动画;默认值如下 -->
<progress percent="20" show-info=false strokeWidth='6px' color='#09BB07' active=false />

logo
logo

  • 表单组件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
<!-- 包括button,checkbox,form,input,label,picker(滚动选择器),radio,slider,switch -->
<!-- auto-focus:自动对焦,bindchange:输入框失去焦点时,获取值event.detail.value ,
bindinput:键盘输入时触发-->
<input placeholder="" auto-focus maxlength=140, bindchange='bindchange' bindinput='bindinput' />
<!-- 滚动选择器 -->
<!-- 1:普通
range(只在modal='selector'时有效):可将地区放到里面;
value(modal为selector是数字,表示从0开始选中第几个;
bindchange:value改变触发,e.detail.value) -->
<view class="section">
<view class="section__title">地区选择器</view>
<picker modal='selector' bindchange="bindPickerChange" value="{{index}}" range="{{array}}">
<view class="picker">
当前选择:{{array[index]}}
</view>
</picker>
</view>
<!-- 2:时间 -->
<view class="section">
<view class="section__title">时间选择器</view>
<picker mode="time" value="{{time}}" start="09:01" end="21:01" bindchange="bindTimeChange">
<view class="picker">
当前选择: {{time}}
</view>
</picker>
</view>
<!-- 3:日期 -->
<view class="section">
<view class="section__title">日期选择器</view>
<picker mode="date" value="{{date}}" start="2015-09-01" end="2017-09-01" bindchange="bindDateChange">
<view class="picker">
当前选择: {{date}}
</view>
</picker>
</view>


Page({
data: {
array:["美国","中国","巴西","日本"],
index:0,
date:"2016-09-01",
time:"12:01"
},
bindPickerChange: function(e) {
console.log('picker发送选择改变,携带值为', e.detail.value)
this.setData({
index: e.detail.value
})
},
bindDateChange:function(e){
this.setData({
date:e.detail.value
})
},
bindTimeChange:function(e){
this.setData({
time:e.detail.time
})
}
})
  • 操作反馈:action-sheet(从屏幕底部出现的菜单表),modal,toast(​消息提示框),loading

    1
    2
    3
    4
    5
    6
    7
    8

    <!-- 都是通过hidden来控制隐藏还是显示 -->
    <action-sheet hidden="{{actionSheetHidden}}" bindchange="actionSheetChange">
    <block wx:for-items="{{actionSheetItems}}">
    <action-sheet-item class="item" bindtap="bind{{item}}">{{item}}</action-sheet-item>
    </block>
    <action-sheet-cancel class="cancel">取消</action-sheet-cancel>
    </action-sheet>
  • 媒体组件:audio,image,video

1
2
3
4
5
6
<!-- poster:默认控件上的音频封面的图片资源地址;
action:控制音频的播放、暂停,播放速率、播放进度的对象,有method和data两个参数
controls:是否显示默认控件。。。等 -->
<audio poster="{{poster}}" name="{{name}}" author="{{author}}" src="{{ src }}" action="{{action}}" controls loop></audio>
<!-- mode:图片裁剪、缩放的模式 13 -->
<image style="width: 200px; height: 200px; background-color: #eeeeee;" mode="{{item.mode}}" src="{{src}}"></image>

logo

  • 地图和画布 map,canvas

api

(最多可以同时调用5个API);
最常用的为:wx.request();

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
wx.request({
url: app.globalData.HOST_URI+'/msg/list',
data: {
cpage: page,
pagesize: 5,
userId: app.globalData.userId,
},
method: "GET",
success: function (res) {
var data = res.data.data.content;

data.map(function (item, index) {
var createDate = that.changeDate(new Date(item.msgSendTime)),
changeIsRead = that.changeRead(item.isRead);
item.msgSendTime = createDate.slice(5,11);
// 把gmtCreate转换为了msgSendTime,把gmtModify改为createDate
item.gmtCreate = createDate.slice(0,11);
item.gmtModify = createDate;
item.isRead = changeIsRead;
dataList.push(item);
});

that.setData({
articleDatas: dataList,
loadHidden: true,
eachData: data,
});
},
})

除了在每个json中设置window页面。还可以在js的onReady中设置

遇到的问题

  • 不请求ajax的情况下,从列表页跳转到单个详情页。
    解决:利用了全局变量及e.currentTarget.dataset
  • 重新加载页面:(从一个月面跳转到另一个页面再反悔当前页面重新加载数据)
    解决:点击跳转时重新 low 了一次数据(已读未读)。
  • 修改input框中的内容
    解决:设置了两个input框,一个是从data取到的数据,一个是修改后的数据。修改后让第一个隐藏,第二个出现
  • 显示群资料时区分是否是自己创建的:
    解决:url传了两次值
  • 其他 上拉加载更多,转码解码等
文章目录
  1. 1. 跟普通项目区别:
  2. 2. app.js:
    1. 2.0.1. 1:小程序的生命周期函数,官方文档截图:
    2. 2.0.2. 2:声明全局变量:当在多个页面中公用一个变量时,可以在此声明全局变量。全局变量可被声明在页面中的
  • 3. app.json:
  • 4. 各个页面的js,wxml,wxss,json
  • 5. js
  • 6. wxml 包括数据绑定、条件渲染、列表渲染、模版、引用、导航
  • 7. wxss
  • 8. json
  • 9. 组件
  • 10. api
  • 11. 遇到的问题
  • ,