微信小程序

微信小程序官方文档

一、准备工作

  • 申请账号
  • 安装开发工具(微信自己的开发工具)
  • 微信自己弄了一套语言,目录结构如下


    结构

    图片.png

有四种不同类型的文件

  • .json 后缀的 JSON 配置文件
  • .wxml 后缀的 WXML 模板文件(相当于web中的HTML)
  • .wxss 后缀的 WXSS 样式文件(CSS)
  • .js 后缀的 JS 脚本逻辑文件(JS)

二、配置

1.小程序配置 app.json

对当前小程序的全局配置,包括了小程序的所有页面路径、界面表现、网络超时时间、底部 tab 等

很必要的是"pages"的配置(路径一定要对),描述当前小程序所有页面路径,这是为了让微信客户端知道当前你的小程序页面定义在哪个目录。

{
  "pages":[
    "pages/index/index",
    "pages/logs/logs"
  ],
  "window":{
    "backgroundTextStyle":"light",
    "navigationBarBackgroundColor": "#fff",
    "navigationBarTitleText": "WeChat",
    "navigationBarTextStyle":"black"
  }
}
//window字段 —— 小程序所有页面的顶部背景颜色,文字颜色定义在这里的。

三、WXML模板、WXSS样式、JS交互

每一个文件下的index是本文件的根文件,可以对整个文件操作,而每个页面下的则只对本页面作用

1.WXML
  • 标签用的是 view, button, text 等,都是已包装好的基本能力,小程序还有地图<map></map>、视频<video></video>等等组件能力。
  • 还有类似于VUE的 wx:if 的属性以及 {{ }} 的表达式。用 MVVM 的开发模式,把渲染和逻辑分离。简单来说就是不要再让 JS 直接操控 DOM,JS只需要管理状态即可,然后再通过一种模板语法来描述状态和界面结构的关系即可。
    如显示hello world
//WXML
<text></text>
//JS
this.setData({ msg: "Hello World" })
//通过 {{ }} 的语法把一个变量绑定到界面上,我们称为数据绑定。
  • 仅仅通过数据绑定还不够完整的描述状态和界面的关系,还需要 if/else, for等控制能力,在小程序里边,这些控制能力都用 wx: 开头的属性来表达。
2.WXSS
  • 具有 CSS 大部分的特性,也有了一些扩充和修改。
  • 新增了尺寸单位。在写 CSS 样式时,开发者需要考虑到手机设备的屏幕会有不同的宽度和设备像素比,采用一些技巧来换算一些像素单位。WXSS 在底层支持新的尺寸单位 rpx ,开发者可以免去换算的烦恼,只要交给小程序底层来换算即可,由于换算采用的浮点数运算,所以运算结果会和预期结果有一点点偏差。
  • 提供了全局的样式和局部样式。和前边 app.json的概念相同,你可以写一个 app.wxss 作为全局样式,会作用于当前小程序的所有页面,局部页面样式 page.wxss 仅对当前页面生效。
  • WXSS 仅支持部分 CSS 选择器
3.JS
  • 和用户做交互:响应用户的点击、获取用户的位置等。
  • 在 JS 中调用小程序提供的丰富的 API,利用这些 API 可以很方便的调起微信提供的能力,例如获取用户信息gegUserInfo、微信支付requsetPayment等。文件来处理用户的操作。

四、逻辑层

1.App()

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

全局的 getApp() 函数可以用来获取到小程序实例。

// other.js
var appInstance = getApp()
console.log(appInstance.globalData) // I am global data
  • 注意:
    1.App() 必须在 app.js 中注册,且不能注册多个。
    2.不要在定义于 App() 内的函数中调用 getApp() ,使用 this 就可以拿到 app 实例。
    3.不要在 onLaunch 的时候调用 getCurrentPages(),此时 page 还没有生成。
    4.通过 getApp() 获取实例之后,不要私自调用生命周期函数。

2.注册页面Page

Page()函数用来注册一个页面,接受一个 object 参数,其指定页面的初始数据、生命周期函数、事件处理函数等。
是在小程序里面用到很重要的一个函数。(基本都要用)

  • 初始化数据将作为页面的第一次渲染。
    data 将会以 JSON 的形式由逻辑层传至渲染层,所以其数据必须是可以转成 JSON 的格式:字符串,数字,布尔值,对象,数组。

渲染层可以通过 WXML 对数据进行绑定。

<view>{{text}}</view>
<view>{{array[0].msg}}</view>

Page({
  data: {
    text: 'init data',
    array: [{msg: '1'}, {msg: '2'}]
  }
})
  • 生命周期函数


    mina-lifecycle.png

onLoad: 页面加载
onShow: 页面显示
onReady: 页面初次渲染完成
onHide: 页面隐藏
onUnload: 页面卸载

  • 页面相关事件处理函数
    onPullDownRefresh: 下拉刷新
    onReachBottom: 上拉触底
    onPageScroll: 页面滚动
    onShareAppMessage: 用户转发

  • 事件处理函数
    Page 中还可以定义一些特殊的函数:事件处理函数。在渲染层可以在组件中加入,当达到触发事件时,就会执行 Page 中定义的事件处理函数。

<view bindtap="viewTap"> click me </view>

Page({
  viewTap: function() {
    console.log('view tap')
  }
})

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

Page.prototype.setData():
setData 函数用于将数据从逻辑层发送到视图层(异步),同时改变对应的 this.data 的值(同步)。
setData也是很重要的一个函数
注意:
1.直接修改 this.data 而不调用 this.setData 是无法改变页面的状态的,还会造成数据不一致。
2.不要把 data 中任何一项的 value 设为 undefined

3.页面路由

  • 在小程序中所有页面的路由全部由框架进行管理。
  • getCurrentPages() 函数用于获取当前页面栈的实例,以数组形式按栈的顺序给出,第一个元素为首页,最后一个元素为当前页面。

4.模块化

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

  • 通过全局函数 getApp()可以获取全局的应用实例,如果需要全局的数据可以在 App() 中设置
    可以将一些公共的代码抽离成为一个单独的 js 文件,作为一个模块。模块只有通过 module.exports 或者 exports 才能对外暴露接口。

  • 注意:require 暂时不支持绝对路径

5.API

6.场景值

  • 可在 App 的 onlaunch 和 onshow 中获取场景值,部分场景值下还可以获取来源应用、公众号或小程序的appId

五、视图层

1.WXML

  • 数据绑定
    WXML 中的动态数据均来自对应 Page 的 data。
    使用双大括号{{ }}将变量包起来

  • 列表渲染
    wx:for
    控制属性绑定一个数组,即可使用数组中各项的数据重复渲染该组件。
    默认数组的当前项的下标变量名默认为 index,数组当前项的变量名默认为 item。
    如果要一次性判断多个组件标签,可以使用一个 <block/> 标签将多个组件包装起来,并在上边使用 wx 控制属性。<block/> 并不是一个组件,它仅仅是一个包装元素,不会在页面中做任何渲染,只接受控制属性。
    用 wx:key 来指定列表中项目的唯一的标识符。

  • 条件渲染
    wx:if
    在框架中,使用 wx:if="{{condition}}" 来判断是否需要渲染该代码块,也可以用 wx:elif 和 wx:else 来添加一个 else 块。
    可用<block></block>

wx:if 和 hidden区别:
wx:if 的条件值切换时,框架有一个局部渲染的过程,会确保条件块在切换时销毁或重新渲染。 wx:if 也是惰性的,若在初始渲染条件为 false,框架什么也不做,在条件第一次变成真的时候才开始局部渲染。
hidden,组件始终会被渲染,只是简单的控制显示与隐藏。
一般来说,wx:if 有更高的切换消耗而 hidden 有更高的初始渲染消耗。因此,如果需要频繁切换的情景下,用 hidden 更好,如果在运行时条件不大可能改变则 wx:if 较好。

  • 模板
    WXML提供模板(template),可以在模板中定义代码片段,然后在不同的地方调用。
    使用 is 属性,声明需要的使用的模板,然后将模板所需要的 data 传入
    <template is="msgItem" data="{{...item}}"/>
    模板拥有自己的作用域,只能使用 data 传入的数据以及模版定义文件中定义的 <wxs /> 模块。
  • 事件
    分为冒泡事件和非冒泡事件:

冒泡事件:当一个组件上的事件被触发后,该事件会向父节点传递。
非冒泡事件:当一个组件上的事件被触发后,该事件不会向父节点传递。
key 以bind(冒泡)或catch(阻止冒泡)开头。
捕获阶段,事件到达节点的顺序与冒泡阶段相反。

  • 引用
    WXML 提供两种文件引用方式import和include。

2.WXS

  • 模块
    WXS 代码可以编写在 wxml 文件中的 <wxs> 标签内,或以 .wxs 为后缀名的文件内。
    <wxs> 模块只能在定义模块的 WXML 文件中被访问到。使用 <include> 或 <import> 时,<wxs> 模块不会被引入到对应的 WXML 文件中。
    <template> 标签中,只能使用定义该 <template> 的 WXML 文件中定义的 <wxs> 模块。
  • 变量
  • 注释
// 方法一:单行注释

/*
方法二:多行注释
*/

/*
方法三:结尾注释。即从 /* 开始往后的所有 WXS 代码均被注释
  • 运算符
  • 语句
  • 数据类型:
    number : 数值
    string:字符串
    boolean:布尔值
    object:对象
    function:函数
    array : 数组
    date:日期
    regexp:正则
  • 基础类库

3.WXSS

  • 尺寸单位 :rpx
  • 样式导入:@import语句可以导入外联样式表 (相对路径)
  • 内联样式
    styleclass
  • 选择器
    .class
    #id
    element
    element element
    ::after
    ::before
  • 全局样式和局部样式
    定义在 app.wxss 中的样式为全局样式,作用于每一个页面。在 page 的 wxss 文件中定义的样式为局部样式,只作用在对应的页面,并会覆盖 app.wxss 中相同的选择器。
  • 基础组件快速开发
  • 自定义组件
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,165评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,503评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,295评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,589评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,439评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,342评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,749评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,397评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,700评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,740评论 2 313
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,523评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,364评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,755评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,024评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,297评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,721评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,918评论 2 336

推荐阅读更多精彩内容

  • 昨天看了一下微信小程序官方文档,总结一下自己学习的个人心得. 首先从官方文档给的框架说起,微信小程序官方文档给出了...
    Mr大大大阅读 47,131评论 9 68
  • WXML WXML(WeiXin Markup Language)是微信的一套标签语言,结合基础组件、事件系统,可...
    许剑锋阅读 6,759评论 3 51
  • 微信小程序在无论在功能、文档及相关支持方面,都是优于前面几种微信账号类型,它提供了很多原生程序才有的接口,使得我们...
    未央大佬阅读 2,282评论 0 12
  • 最近做了一个投票的微信小程序,开发过程主要还是参考官方文档:https://mp.weixin.qq.com/de...
    june5253阅读 21,958评论 1 11
  • 那是一九五几年吧。 那个孩子,他没大名,大家都叫他傻子,他只会对着你傻呵呵的笑。 他出生的时候是他爹妈成家的二年后...
    乐播报阅读 625评论 0 1