微信小程序开发-基础

wxml

wxml(WeiXin Markup Language)作为小程序前端的结构语言,和html类似,但是有以下几项需要注意:

  • 属性是大小写区分的;
  • 标签必须是严格闭合,否则编译报错;
  • 属性值可以动态改变,使用 {{name}} 表示,但是该变量也是大小写区分的,并且必须用双引号括起来;
  • 没有被定义的变量的或者是被设置为 undefined 的变量不会被同步到 wxml 中;
  • 如果一个组件需要控制渲染多个 view 时可以用一个 block 来囊括,相当于html中的 template

赋值

js文件里 Page 实例中修改data的时候,方法如下:

this.data.nameArray = [];
this.setData({
    nameArray: this.data.nameArray
})

之所以要使用 setData 方法,是为了达到将数据从逻辑层传递到渲染层,在对比JS对象的前后差异,把差异应用到Dom树上,渲染出新的UI界面。
setData 方法是Page实例的原型函数,该操作是一个异步操作,第二个参数是一个callback回调,是这次 setData 对界面渲染完成后触发的回调函数。

逻辑语法

{{}} 该括号中,除了可以直接填写变量名之后,还可以使用三元运算符,或者是简单的数字运算,或者是字符串的拼接等操作。

条件逻辑

wx:if / wx:elif / wx:else 组成了条件判断的使用情况,具体例子如下:

<block wx:if="{{total > 10}}">
    <view> view1 </view>
    <view> view2 </view>
</block>
<view wx:elif="{{total > 5}}">
    view 3
</view>
<view wx:else>
    view 4 
</view>

列表渲染

wx:for / wx:for-index / wx:for-item / wx:key 组成了列表渲染的组件,默认数组的当前项的下标变量名默认为 index ,数组当前项的变量名默认为 item,并且 wx:for-index 可以重命名当前循环的下标名(index),wx:for-item 可以重命名当前循环的元素(item),具体例子如下:

<view wx:for="{{names}}" wx:for-index="indexNewName" wx:for-item="itemNewName">
    {{indexNewName}}: {{itemNewName}}
</view>

如果列表数据有新增或减少,或者是列表里元素的数据有变化时,为了达到动态渲染的效果,这时候可以使用 wx:key 来标识每一个渲染。wx:key 有两种形式提供:

  • 字符串: 代表在for循环中的 array 的某个 property ,该属性需要保证是列表中唯一的字符串或数字,且不能动态改变;
  • this: 保留关键字this代表在for循环中的item本身,这种表示需要保证item是一个唯一的字符串或者数字
    举例如下:
<!-- 字符串: 列表里item中的一个唯一属性 -->
<switch wx:for="{{objectArray}}" wx:key="uniqueProperty" > {{item.uniqueProperty}}: {{item.otherProperty}} </switch>

<!-- this: 列表里item是一个唯一的字符串或者是数字 -->
<switch wx:for="{{numberArray}}" wx:key="*this" > {{item}} </switch>

模版

在wxml中可以使用 template 来定义模版,并用 name 属性来表示模版名字,在真正需要使用并渲染该模版的时候,就用 is 来表示使用的是哪一个模版,并且使用 data 来表示传入到该模版的渲染数据,具体例子如下:

<!-- 模版定义内容 -->
<template name="tmpl_1">
    <view> {{id}}: {{name}}</view>
</template>

<!-- 实例化渲染使用模版, item = {id: 1, name: 'js'} -->
<template is="tmpl_1" data="{{...item}}"/>

引用

wxml提供了两种引用方法: import / include。两种方式使用的场景不同

  • import 适用于引入上面提到的模版定义内容,但是该方法不能嵌套引入;
  • include 适用于将目标文件内容(除了 <template/> / <wxs/>),拷贝到引入的位置处
    使用方法如下:
<!-- 使用 import -->
<import src="tmpl.wxml"/>

<!-- 使用 include -->
<include src="header.wxml"/>

共同属性

共同属性指的是: 所有wxml标签都支持属性。包括: id / class / style / hidden(Boolean) / data-* / bind* / catch*.

  • hidden 是一个Boolean值,表示组件是否显示,默认显示
  • data-* 自定义属性(任何类型),组件上触发的事件时,会发送给事件处理函数
  • bind* / catch* 组件的事件

wxss

wxss(WeiXin Style Sheets),小程序的样式语言。
包括三种样式:

  • 项目公共样式,也即是项目根目录下的 app.wxss 文件,该样式默认应用到所有页面;
  • 页面样式,也即是每个页面同目录下,且与页面名一样的 {pageName}.wxss 文件,该样式默认应用到该页面样式;
  • 其他样式,也就是在在根目录下用户新建一个目录,用于存放其他的样式文件,该样式文件要使用,需要用于引用才生效。

其他样式的引用方法如下两种:

@import url('../../otherss/common.wxss')
@import '../../otherss/bar.wxss'

选择器样式优先级

!important > sytle="" > #id > .class > element
微信提供了官方样式库 WeUI.wxss

js

小程序中的js由三部分组成: ECMAScript + 小程序框架 + 小程序API

小程序可以将任何一个js文件作为一个模块,通过 modules.exports 或者 exports 对外暴露接口。
例如如下代码:

// moduleA.js
module.exports = function (value) {
    console.log(value);
}

// test.js
var printfunc = require('./moduleA');
printfunc('Hello world.')

小程序中js的执行顺序是: 先执行根目录下 app.js 中的内容,如果该文件中有 require 引入其他的js文件,那么也要根据引入的顺序来加载执行;然后按照 app.json 中定义的 pages 的顺序,逐一执行。

小程序中js变量的作用域,是只在本文件中有效的。不同的文件中可以声明和相同的变量和函数,不会互相影响。

小程序中其他js文件如果想要使用全局变量 app.jsApp 实例里定义的变量,可以在文件中使用 var globalData = getApp(); 来获取全局参数。

小程序的每个page页面里的逻辑层

每个页面的逻辑层都是一个 Page 实例,该实例包括如下内容:

Page({
    // 内容
});
  1. 页面的初始数据: data: {}
  2. 生命周期函数 - 监听页面加载: onLoad: function (options) {}
  3. 生命周期函数 - 监听页面显示: onShow: function () {}
  4. 生命周期函数 - 监听页面初次渲染完成: onReady: function () {}
  5. 生命周期函数 - 监听页面隐藏: onHide: function () {}
  6. 生命周期函数 - 监听页面卸载: onUnload: functioin () {}
  7. 页面相关事件处理函数 - 监听用户下拉动作: onPullDownRefresh: function () {}
  8. 页面上拉触底事件的处理函数: onReachBottom: function () {},可以作为分页请求的入口
  9. 用户点击右上角分享: onShareAppMessage: function () {}
  10. 用户滚动滚动条函数: onPageScroll: function () {}

初次进入到页面,会触发 onLoad / onShow / onReady 事件;
如果触发了右上角的分享功能,那么页面会触发 onShareAppMessageonHide 事件,等待分享对话框关闭之后,会触发 onShow 事件;
下拉刷新页面的时候,会触发 onPullDownRefresh 事件;
离开该页面会触发 onUnload 事件

注意: Page实例中的data属性里的数据value不要设为 undefined,不然会引起意想不到的bug.
onShareAppMessage 中的返回值里可以设置分享的一些属性,比如: title / path 等,这样用户在通过该分享连接进来的时候,就会携带这些参数进来。

页面路由

  • 使用 wx.navigateTo({url: pageD}) 表示往当前页面栈中多推入一个页面D
  • 使用 wx.navigateBack() 表示退出当前页面栈最顶端的一个页面
  • 使用 wx.redirectTo({url: pageE}) 表示替换当前页为页面E,当页面栈总数为10无法再新增页面时,就是使用该 redirectTo API来进行页面跳转
  • 使用 wx.switchTab({url: pageF}) 表示清空当前的页面栈里的页面(除了tabBar中pageF前面的页面不会清空),页面栈为 [pageF],切换到tabBar中pageF前面的页面时,例如pageA时,不会触发pageA的 onLaunch 生命周期函数
  • 使用 wx.reLaunch({url: pageF}) 表示重启小程序,并且进入到pageF的页面,页面栈为 [pageF]

注意: wx.navigateTowx.redirectTo 只能打开非tabBar页面,而 wx.switchTab 只能打开tabBar页面。

API

小程序提供的API按照功能分为: 网络、媒体、文件、数据缓存、位置、设备、界面和界面节点信息。API的调用一般有如下约定:

  • wx.on* 开头的API是监听某个事件发生的API接口,接受一个callback函数作为参数。当该事件触发时,会调用callback函数。
  • 多数API接口为异步接口,都接受一个Object作为参数。
  • API的Object参数一般由 success / fail / complete 三个回调来接受接口调用结果。
  • wx.get* 开头的API是获取宿主环境数据的接口。
  • wx.set* 开头的API是写入数据到宿主环境的接口。

事件

在小程序里,事件指的是:“用户在渲染层的行为反馈”以及“组件的部分状态反馈”抽象成渲染层传递给逻辑层的事件。

事件绑定和冒泡捕获

事件绑定的写法和组件属性一致,以key="value"的形式,其中:

  1. key以bind或者catch开头,然后跟上事件的类型,如:bindtap/catchtouchstart。自基本库1.5.0起,bind和catch后可以紧跟冒号,其含义不变,如: bind:tap/catch:touchstart。同时bind和catch前面还可以加上 capture- 来表示事件的捕获阶段,没有的话表示事件的冒泡阶段。
  2. value是一个字符串,需要在对应的页面Page构造器中定义同名的函数,否则触发事件时,在控制台有报错信息。

bind事件绑定不会组织冒泡事件向上冒泡,catch事件绑定可以阻止冒泡事件向上冒泡。capture-catch 将中断捕获阶段并取消冒泡阶段。

其他组件的自定义事件,如无特别说明,都是非冒泡事件,如 <form/> 的submit事件,<input/>的input事件,<scroll-view/>的scroll事件

补充:说明一下事件冒泡和捕获。
"DOM2级事件"规定的事件流包含三个阶段:事件捕获、处于目标阶段和事件冒泡阶段。首先发生的是事件捕获,然后是实际的目标接收到事件,最后阶段是冒泡阶段。

兼容

通过API wx.getSystemInfoSync() 可以获取到系统和小程序基础库版本信息 SDKVersion,该参数在开发环境的工程配置文件 project.config.json 中的配置项 libVersion

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353

推荐阅读更多精彩内容