微信小程序开发分享

1.在微信官网下载开发工具

2.新建小程序项目


---AppID:如果有就填写,如果没有点击绿色文字跳过填写,(没有也可以开发只不过没有在手机预览的功能);
---项目名称:命名一个简单明了的名称;
---项目目录:选择一个开发的文件夹,此时项目目录下方会出现一个创建quick start项目的选项,这里可以快速帮你构建一个项目的完整目录,不建议取消勾选。(如果要打开其他人的demo需要选择到pages文件夹的上一层级,不然无法显示);
---点击添加项目进行下一步;
Tips:在设置中有设置代理选项,注意在这里如果设置了代理,有可能在编辑器内显示空白;

3.小程序结构简介


其中,.wxml 是页面的结构文件,.js后缀的是脚本文件,.json后缀的文件是配置文件,.wxss后缀的是样式表文件。

├───app.js // 小程序逻辑
├───app.json // 小程序公共设置
├───app.wxss // 小程序公共样式
├───utils // 用来放置工具类js文件
│ └───utils.js // 工具类js
└───pages // 项目页面开发目录,里面的每个子目录代表一个独立页面
├───index // index 页面目录
│ ├───index.js // index 页面逻辑
│ ├───index.wxml // index 页面结构
│ └───index.wxss // index 页面样式表
└───logs // logs 页面目录
├───logs.js // logs 页面逻辑
├───logs.json // logs 页面数据
├───logs.wxml // logs 页面结构
└───logs.wxss // logs 页面样式表

在pages中建立的页面都需要在根目录下的app.json声明,相当于设置路由,其他公共设置也需要在这里设置;官方教程

<!--js-->
  "pages":[
    "pages/index/index",
    "pages/logs/logs"
  ],
  "window":{
    "backgroundTextStyle":"light",
    "navigationBarBackgroundColor": "#fff",
    "navigationBarTitleText": "WeChat",
    "navigationBarTextStyle":"black"
  }
}
Tips:

---数组的第一项代表小程序的初始页面;
---小程序中新增/减少页面,都需要对 pages 数组进行修改,特别的,如果减少页面但是未修改pages的数组,编译会抛出异常;
---在这里修改数组后框架会自行去寻找路径中的文件,如果路径中的json文件内容为空的话,会抛出异常;
---同样的,路径中js为空也会抛出“Page调用异常”的错误,所以要在js中加入“Page({})”;

4小程序开发

4.1.数据绑定官方教程

微信小程序数据绑定使用"Mustache"语法(双大括号)将变量包起来;

<!--wxml-->
<view> {{message}} </view>
<!--js-->
Page({
  data: {
    message: 'Hello MINA!'
  }
})

当需要展示一组数据时,可以使用wx:for;更多使用方法

<view wx:for="{{array}}" wx:for-item="item">
  {{index}}: {{item.message}}
</view>

Tips:默认数组的当前项的下标变量名默认为index,数组当前项的变量名默认为item

<!--js-->
Page({
  data: {
    array: [{
      message: 'foo',
    }, {
      message: 'bar'
    }]
  }
})
取值传值方式

1.列表index下标取值,并且在页面传值
实现方式是:data-index="{{index}}"赋值及e.currentTarget.dataset.index来获取即可;
从服务列表页中传服务id到服务详情页面,以获取服务详情信息;
server/list页面实现以下代码

<!--wxml-->
      <view bindtap="detailmovie" id="{{item.id}}">
        <view class="move-min">
          <view class="move-image">
              <image src="{{item.images.large}}"></image>
          </view>
          <view class="title">{{item.title}}</view>
        </view>
      </view>
<!--js-->
  detailmovie: function (e) {
    //使用currentTarget获取id
    var id = e.currentTarget.id;
//把获取到的id存在全局变量中,下一个页面直接调用;
    app.requestDetailid = id;
    console.log(id);
    //一个应用同时只能打开5个页面,当已经打开了5个页面之后,wx.navigateTo不能正常打开新页面。请避免多层级的交互方式,或者使用wx.redirectTo,
    wx.navigateTo({
      url: '../detail/detail',
    })
  },

页面实现onLoad(options)方法,从url路径中获取objectId;

<!--js-->
onLoad: function (options) {
  var objectId = options.objectId
}

2.form表单取值
通过<form bindsubmit="formSubmit">与<button formType="submit">标签配合使用
布局如下:

<!--wxml-->
<form bindsubmit="formSubmit">
  <input name="detail" placeholder="详情地址" />
  <input name="realname" placeholder="收件人姓名" />
  <input name="mobile" placeholder="手机号码" type="number"/>
  <button formType="submit" type="primary">Submit</button>
</form>
<!--js-->
formSubmit: function(e) {
  // detail
  var detail = e.detail.value.detail;
  // realname
  var realname = e.detail.value.realname;
  // mobile
  var mobile = e.detail.value.mobile;
}

通过<input bindconfirm="realnameConfirm">实现

<!--js-->
realnameConfirm: function(e) {
  var realname = e.detail.value;
}
Tips:

1: 视图层嵌入的是{{message}}而不是{{data.message}},微信框架默认设定视图层绑定的变量定义在Page对象的data属性中,也就是说,如果变量需要绑定到视图层,一定要定义data属性中;

2: 通过调用Page对象的setData(Page对象预定义)方法,可以更新界面数据,但是直接设置变量是无效的,因此对于绑定到视图层的变量,要永远使用setData方法来设置变量值;

4.2.文件引入

为了提升体验流畅度,编译后的代码包大小需小于 1MB ,大于 1MB 的代码包将上传失败

1.1 WXML

WXML提供两种文件引入方式,import和include。区别在于:import可以引入定义好的template模板,模板是有作用域的;而include就是拷贝一个公用的代码片段到目标文件中,适合做公共页面片的拆分。

import可以在该文件中使用目标文件定义的template,如:
在 item.wxml 中定义了一个叫item的template:

<!-- item.wxml -->
<template name="item">
  <text>{{text}}</text>
</template>

在 index.wxml 中引用了 item.wxml,就可以使用item模板:

<import src="item.wxml"/>
<template is="item" data="{{text: 'forbar'}}"/>

Tips:
import 有作用域的概念,即只会 import 目标文件中定义的 template,而不会 import 目标文件 import 的 template。

如:C import B,B import A,在C中可以使用B定义的template,在B中可以使用A定义的template,但是C不能使用A定义的template。

<!-- A.wxml -->
<template name="A">
  <text> A template </text>
</template>
<!-- B.wxml -->
<import src="a.wxml"/>
<template name="B">
  <text> B template </text>
</template>
<!-- C.wxml -->
<import src="b.wxml"/>
<template is="A"/>  <!-- Error! Can not use tempalte when not import A. -->
<template is="B"/>
1.2 wxss

小程序支持样式的@import引入方式

import "../../wxss/common.wxss";
```
######Tips:
定义在 app.wxss 中的样式为全局样式,作用于每一个页面。在 page 的 wxss 文件中定义的样式为局部样式,只作用在对应的页面,并会覆盖 app.wxss 中相同的选择器。

小程序支持的选择器在官方公布的文档中包括.class、#id、 element、element,element、::after(注意是双冒号)、::before这6种选择器。 

经过测试,小程序对于:first-child、:last-child、.class-a .class-b{},甚至更多层级的嵌套都是支持的。 
不过官方并不推荐级联的这种写法,因为考虑到后面切Native的扩展可能,会没办法支持级联选择。 
所以保险起见,不建议.class-a .class-b{}这种级联的写法,以免后期工具过滤导致页面错乱。

WXSS支持的单位有px、rem和rpx,其中rem和rpx可以针对屏幕容器进行适配,px则为固定尺寸。 
其中1rpx=0.5px,在WXSS和WXML中定义的rpx单位最终会转换为在手机端可以识别的rem单位。 
![HTML5与小程序标签差别](http://upload-images.jianshu.io/upload_images/4357202-dac8f1707098ebb2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
Tips:navigator仅支持5级页面的跳转; navigator不可跳转到小程序外的链接地址;[官方教程](https://mp.weixin.qq.com/debug/wxadoc/dev/component/navigator.html)
小程序的image与HTML5的img最大的区别在于:小程序的image是按照background-image来实现的。 默认image的高宽是320*240。必须通过样式定义去覆盖这个默认高宽,auto在这里不生效。[官方教程](https://mp.weixin.qq.com/debug/wxadoc/dev/component/image.html)

####4.3.API的使用
#####1wx.request[官方教程](https://mp.weixin.qq.com/debug/wxadoc/dev/api/network-request.html)
wx.request ≈ ajax;
```
wx.request({
  url: 'test.php', //仅为示例,并非真实的接口地址
  data: {
     x: '' ,
     y: ''
  },
  header: {
      'content-type': 'application/json'
  },
  success: function(res) {
    console.log(res.data)
  }
})
```
微信小程序POST请求服务端获取不到参数
1.需要把Content-type改成‘application/x-www-form-urlencoded’才可以正常获取
2.修改Content-type后,请求参数不会自动序列化,需要使用JSON.stringify转化字符串才可以正常请求
客户端
```
wx.request({
  url: '/index',
  method: 'POST',
  data: {
    answer: JSON.stringify(needData),
  },
  header: { "content-type": "application/x-www-form-urlencoded" },
  dataType: "json",
 success: function (data) {
      that.setData({
          showLoading: false,
          data: data.data,
        });
     },
});
```
服务器端
```
    public function answer(){
        $answer=I('post.answer');
        $answer=htmlspecialchars_decode($answer);
        $answer=json_decode($answer);
    }
```
Tips: wx.request发起的是 HTTPS 请求。HTTP请求只能在本地预览,若要在真机预览需要打开调试模式;
[微信豆瓣小程序demo下载地址](https://github.com/wulitang/wxapp.git)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容