view
视图容器 div
1
scroll-view
可滚动视图区域
div
,滑块做法<scroll-view scroll-y bindscrolltoupper="upper" bindscrolltolower="lower"
bindscroll="scroll" scroll-into-view="{{toView}}" scroll-top="{{scrollTop}}">
<view id="green" class="scroll-view-item bc_green">view>
<view id="red" class="scroll-view-item bc_red">view>
<view id="yellow" class="scroll-view-item bc_yellow">view>
<view id="blue" class="scroll-view-item bc_blue">view>
scroll-view>
swiper
滑块视图容器
<swiper indicator-dots="{{indicatorDots}}"
autoplay="{{autoplay}}" interval="{{interval}}" duration="{{duration}}">
<block wx:for="{{imgUrls}}">
<swiper-item>
<image src="{{item}}" class="slide-image" width="355" height="150"/>
swiper-item>
block>
swiper>
text
文本 span
image
a
标签,可以跳转页面也可以跳转新的小程序 open-type
跳转方式 navigate
(默认) 保留当前跳转,跳转后可以返回当前页(页面左上角有一个<
可以返回上一页),它与wx.navigateTo跳转效果是一样的; 跳转到新页面
打开绑定的小程序
redirect
关闭当前页跳转,是无法返回当前页,它与wx.redirrectTO跳转效果是一样的; 在当前页打开
switchTab
跳转底部标签导航指定的页面,它与wx.switchTab跳转效果是一样的; switchTab
;切换 Tab
img
标签
进阶
简单绑定
<view> {{ message }} view>
//index.js
Page({
data: {
message: 'Hello MINA!'
}
})
<view id="item-{{id}}"> view>
//index.js
Page({
data: {
id: 0
}
})
总结:
我们在.js里面的page()-data定义对象,例 "id:0",就可以在页面上{{id}},输出0,
还可以在后面的js代码中绑定事件,动态改变 data定义对象 的值,页面的值就相应改变了;
WEB的js代码需要找到元素,找到值,再给元素赋值,比较麻烦;
而小程序的js就一开始绑定了变量,然后再js里面改变变量,然后页面就可以相应改变了,省去了找元素这一步骤。
列表渲染 - wx:for
<view wx:for="{{array}}">
{{index}}: {{item.message}}
view>
//index.js
Page({
data: {
array: [{
message: 'foo',
}, {
message: 'bar'
}]
}
})
<view wx:for="{{array}}" wx:for-index="idx" wx:for-item="itemName">
{{idx}}: {{itemName.message}}
view>
wx:for 也可以嵌套,下边是一个九九乘法表
<view wx:for="{{[1, 2, 3, 4, 5, 6, 7, 8, 9]}}" wx:for-item="i">
<view wx:for="{{[1, 2, 3, 4, 5, 6, 7, 8, 9]}}" wx:for-item="j">
<view wx:if="{{i <= j}}">
{{i}} * {{j}} = {{i * j}}
view>
view>
view>
并不是一个组件,它仅仅是一个包装元素,不会在页面中做任何渲染,只接受控制属性。)
<block wx:for="{{[1, 2, 3]}}">
<view> {{index}}: view>
<view> {{item}} view>
block>
总结:
wx:for 列表渲染 相当于PHP的foreach循环,大同小异
php:
foreach($data => $key => $value){
echo $key.'=>'.$value;
}
ThinkPHP 3.2
"data" id="value">
{$key}:{$value}
ThinkPHP 5
{volist name="data" id="value"}
{$key}:{$value}
{/volist}
小程序:
for="{{data}}" wx:for-index="key" wx:for-item="value">
{{key}}: {{value}}
条件渲染 - wx:if
<view wx:if="{{condition}}"> True view>
也可以用 wx:elif 和 wx:else 来添加一个 else 块:
<view wx:if="{{length > 5}}"> 1 view>
<view wx:elif="{{length > 2}}"> 2 view>
<view wx:else> 3 view>
block wx:if
因为 wx:if 是一个控制属性,需要将它添加到一个标签上。如果要一次性判断多个组件标签,可以使用一个
标签将多个组件包装起来,并在上边使用 wx:if 控制属性。
<block wx:if="{{true}}">
<view> view1 view>
<view> view2 view>
block>
注意:
并不是一个组件,它仅仅是一个包装元素,不会在页面中做任何渲染,只接受控制属性。
模板
<template name="msgItem">
<view>
<text> {{index}}: {{msg}} text>
<text> Time: {{time}} text>
view>
template>
使用模板
<template is="msgItem" data="{{...item}}"/>
Page({
data: {
item: {
index: 0,
msg: 'this is a template',
time: '2016-09-15'
}
}
})
<template name="odd">
<view> odd view>
template>
<template name="even">
<view> even view>
template>
<block wx:for="{{[1, 2, 3, 4, 5]}}">
<template is="{{item % 2 == 0 ? 'even' : 'odd'}}"/>
block>
事件
什么是事件
事件的使用方式
bindtap="tapName"
,在标签上面绑定事件 <view id="tapTest" data-hi="WeChat" bindtap="tapName"> Click me! view>
Page({
//点击 上面的 view 即可触发 tapName 函数
tapName: function(event) {
console.log(event)
}
})
import
<template name="item">
<text>{{text}}text>
template>
<import src="item.wxml"/>
<template is="item" data="{{text: 'forbar'}}"/>
include
<include src="header.wxml"/>
<view> body view>
<include src="footer.wxml"/>
<view> header view>
<view> footer view>
接口调用成功的回调函数
, fail接口调用失败的回调函数
, complete接口调用结束的回调函数(调用成功、失败都会执行)
来接收接口调用结果。小程序的生命周期——App.js
App() 函数用来注册一个小程序。接受一个 object 参数,其指定小程序的生命周期函数等。先上代码:
App({
onLaunch: function () {
console.log('App onLaunch');
//当小程序初始化完成时,会触发 onLaunch(全局只触发一次)。
},
onShow:function (){
console.log('App onShow');
//当小程序启动,或从后台进入前台显示,会触发 onShow
},
onHide:function(){
console.log('App onHide');
//当小程序从前台进入后台,会触发 onHide
},
onError:function(){
console.log('App onError');
小程序发生脚本错误,或者 api 调用失败时,会触发 onError 并带上错误信息
}
});
总结:将原有的app.js中替换为上面的代码,首次打开小程序,可以在Log信息中看到以下Log信息,会看到onShow()方法会执行两次
App onLaunch
App onShow()
App onShow()
页面的生命周期
onLoad: 页面加载
* 一个页面只会调用一次。
* 接收页面参数 可以获取wx.navigateTo和wx.redirectTo及 中的 query。
onShow: 页面显示
* 每次打开页面都会调用一次。
onReady: 页面初次渲染完成
* 一个页面只会调用一次,代表页面已经准备妥当,可以和视图层进行交互。
onHide: 页面隐藏
当navigateTo或底部tab切换时调用。
onUnload: 页面卸载
当redirectTo或navigateBack的时候调用。
在app.js里面的 onLaunch 写整个项目都会调用到的逻辑以及一些初始化操作,例如,小程序背景音乐的播放控制等;
在页面的.js文件 调用 onLoad 接收参数,调用接口,获取数据,更新渲染页面;
每次打开页面,都会触发 onShow ,所以做购物车的时候,购物车信息要经常更新,就可以在页面的.js文件 调用 onShow 查询购物车,并显示;
-相当于AJAX、相当于接口开发。
- 例:
wx.request({
url: 'https://api.001php.com/api?url=page_class',//开发者服务器接口地址
method: 'POST',//默认:GET,(需大写)有效值:OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT
dataType: 'json',//json, 如果设为json,会尝试对返回的数据做一次 JSON.parse
data: {id:1},//请求的参数
header: {
"Content-Type": "application/x-www-form-urlencoded" //设置请求的 header,header 中不能设置 Referer。
},
//成功后的回调
success: function (res) {
// console.log(res.data) //打印返回数据
//把返回数据存为 data 变量,直接可以在页面上显示输出
that.setData({
list: res.data
})
}
})
//注:header使用什么"Content-Type"?
//application/x-www-form-urlencoded : 通过页面表单方式提交
//application/json : json(要反序列化成字符串),php不能直接解析json字符串
//所以我们做小程序接口,都有重新设置 header Content-Type 为: application/x-www-form-urlencoded
显示消息提示框:wx.showToast(OBJECT)
wx.showToast({
title: '登陆成功',//提示的内容
icon: 'success',//图标,有效值 "success", "loading", "none"
duration: 2000,//提示的延迟时间,单位毫秒,默认:1500
mask:true,// 是否显示透明蒙层,防止触摸穿透,默认:false
success:function(res){
//接口调用成功的回调函数
wx.hideToast()//隐藏消息提示框
}
})
显示 loading 提示框:wx.showLoading(OBJECT),需主动调用 wx.hideLoading 才能关闭提示框
wx.showLoading({
title: '请选择地址',//提示的内容
mask:true,// 是否显示透明蒙层,防止触摸穿透,默认:false
success:function(res){
//接口调用成功的回调函数
}
})
显示 loading 提示框
,再在网络请求完成后,调用, wx.hideLoading()
,隐藏 loading
显示模态弹窗:wx.showModal(OBJECT)
wx.showModal({
title: '删除图片',
content: '确定要删除该图片?',
showCancel: true,//是否显示取消按钮
cancelText:"否",//默认是“取消”
cancelColor:'skyblue',//取消文字的颜色
confirmText:"是",//默认是“确定”
confirmColor: 'skyblue',//确定文字的颜色
success: function (res) {
if (res.cancel) {
//点击取消,默认隐藏弹框
} else {
//点击确定
temp.splice(index, 1),
that.setData({
tempFilePaths: temp,
})
}
},
fail: function (res) { },//接口调用失败的回调函数
complete: function (res) { },//接口调用结束的回调函数(调用成功、失败都会执行)
})
wx.navigateTo({
url: 'test?id=1'
})
wx.redirectTo(OBJECT)
关闭当前页面,跳转到应用内的某个页面。
示例代码:
wx.redirectTo({
url: 'test?id=1'
})
wx.reLaunch(OBJECT)
wx.reLaunch({
url: 'test?id=1'
})
wx.switchTab(OBJECT)
跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面
wx.switchTab({
url: '/index'
})
wx.navigateBack(OBJECT)
// 注意:调用 navigateTo 跳转时,调用该方法的页面会被加入堆栈,而 redirectTo 方法则不会。见下方示例代码
// 此处是A页面
wx.navigateTo({
url: 'B?id=1'
})
// 此处是B页面
wx.navigateTo({
url: 'C?id=1'
})
// 在C页面内 navigateBack,将返回A页面
wx.navigateBack({
delta: 2
})
// 如果是在C页面内 navigateBack,将返回B页面
wx.navigateBack()
Tip
一、异步缓存
设置异步缓存:wx.setStorage(OBJECT)
wx.setStorage({
key:"key",
data:"value"
})
获取异步缓存:wx.getStorage(OBJECT)
wx.getStorage({
key: 'key',
success: function(res) {
console.log(res.data)
}
})
wx.getStorageInfo(OBJECT)
wx.getStorageInfo({
success: function(res) {
console.log(res.keys)
console.log(res.currentSize)
console.log(res.limitSize)
}
})
wx.removeStorage(OBJECT)
wx.removeStorage({
key: 'key',
success: function(res) {
console.log(res.data)
}
})