被 `小程序` 刷了屏,吓得我周末赶紧撸了个 `小程序` 版的 [知乎日报](https://github.com/myronliu347/wechat-app-zhihudaily) 压压惊, 总结一下这个开发体验,和踩过的坑。
## 先上图
![](http://img2.tuicool.com/FJrq2mY.gif)
## 开发环境准备
`小程序` 出来第二天就被破解,第三天微信就把开发工具开发下载了, 现在只需要下载 [微信开发者工具](https://mp.weixin.qq.com/debug/wxadoc/dev/devtools/download.html?t=1474644089359) 就可以使用了,
![](http://img1.tuicool.com/iMnIVfe.png!web)
创建项目的时候,要选择无 appid, 这样就不会有 appid 的验证了。
## 目录结构
![](http://img2.tuicool.com/eUnENnJ.png!web)
* app.js 注册app逻辑, app.wxss 全局样式文件 app.json 配置信息
* pages 存放页面文件
* utils 工具类代码
* images 图片资源文件
小程序中每一个页面都会有三个文件 `.wxml` `.wxss` `.js` ,对应着结构、样式、和逻辑,相当于网页中的 html css 和 js 的关系。
## 开发第一个页面
代码来自新建项目
~~~
<!--index.wxml-->
<view class="container">
<view bindtap="bindViewTap" class="userinfo">
<image class="userinfo-avatar" src="{{userInfo.avatarUrl}}" background-size="cover"></image>
<text class="userinfo-nickname">{{userInfo.nickName}}</text>
</view>
<view class="usermotto">
<text class="user-motto">{{motto}}</text>
</view>
</view>
~~~
~~~
/**index.wxss**/
.userinfo {
display: flex;
flex-direction: column;
align-items: center;
}
.userinfo-avatar {
width: 128rpx;
height: 128rpx;
margin: 20rpx;
border-radius: 50%;
}
.userinfo-nickname {
color: #aaa;
}
.usermotto {
margin-top: 200px;
}
~~~
~~~
//index.js
//获取应用实例
var app = getApp()
Page({
data: {
motto: 'Hello World',
userInfo: {}
},
//事件处理函数
bindViewTap: function() {
wx.navigateTo({
url: '../logs/logs'
})
},
onLoad: function () {
console.log('onLoad')
var that = this
//调用应用实例的方法获取全局数据
app.getUserInfo(function(userInfo){
//更新数据
that.setData({
userInfo:userInfo
})
})
}
})
~~~
新建的项目中,index 下都会看到这些代码,接下来分别介绍 `wxml` `wxss` `js`
### wxml
这个是页面结构的描述文件, 主要用于以下内容
* 用标签形式指定组件使用 `<view></view>`
* 使用 `wx:for` `wx:if` 等指令完成一些模板上的逻辑处理
* 使用 `bind*` 绑定事件
### wxss
样式文件,和 css 语法基本一致,不过支持的选择器语法有限 [看这里](https://mp.weixin.qq.com/debug/wxadoc/dev/framework/view/wxss.html?t=1474644091188) , 可以使用 flexbox 完成布局。
内部也可以使用 `import` 命令引入外部样式文件
~~~
@import "common.wxss";
.pd {
padding-left: 5px;
}
~~~
### js
页面逻辑控制, 遵循 commonJs 规范
~~~
// util.js
function formatTime(date) {
// ....
}
function formatDate(date, split) {
// ...
}
module.exports = {
formatTime: formatTime,
formatDate: formatDate
}
~~~
~~~
var utils = require('../../utils/util.js')
~~~
这里的js 并不是在 浏览器环境下运行, 所以 `window.*` 这一类的代码都会报错, dom 操作也是不被允许的,官方目前好像是不能支持其他的 js 库运行,全封闭式,这个以后应该会逐渐完善。
页面上使用 `Page` 方法来注册一个页面
~~~
Page({
data:{
// text:"这是一个页面"
},
onLoad:function(options){
// 页面初始化 options为页面跳转所带来的参数
},
onReady:function(){
// 页面渲染完成
},
onShow:function(){
// 页面显示
},
onHide:function(){
// 页面隐藏
},
onUnload:function(){
// 页面关闭
}
})
~~~
当我们需要改变 绑定的数据时,必须调用 `setData` 方法修改,才会触发页面更新,像这样:
~~~
Page({
data: {
text: '这是一个页面'
},
onLoad: function() {
this.setData({
text: 'this is page'
})
}
})
~~~
### 条件渲染和列表渲染
以下内容来自微信官方文档。
小程序使用 `wx:if=""` 完成条件渲染,类似于 `vue` 的 `v-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>
~~~
`wx:for` 控制属性绑定一个数组,即可使用数组中各项的数据重复渲染该组件。
内置变量 `index` (数组遍历的下标), `item` (数组遍历的每一项)
~~~
<view wx:for="{{items}}">
{{index}}: {{item.message}}
</view>
~~~
~~~
Page({
items: [{
message: 'foo',
},{
message: 'bar'
}]
})
~~~
使用wx:for-item可以指定数组当前元素的变量名
使用wx:for-index可以指定数组当前下标的变量名:
~~~
<view wx:for="{{array}}" wx:for-index="idx" wx:for-item="itemName">
{{idx}}: {{itemName.message}}
</view>
~~~
### 事件绑定
`wxml` 只是用 `bind[eventName]="handler"` 语法绑定事件
~~~
<view bindtap="bindViewTap" class="userinfo"><text>tap</text></view>
~~~
~~~
Page({
bindViewTap: function(e) {
console.log(e.taget)
}
})
~~~
通过 `data-*` 和 `e.target.dateset` 传递参数
~~~
<view bindtap="bindViewTap" data-test-msg="啦啦啦啦啦啦" class="userinfo"><text>tap</text></view>
~~~
~~~
Page({
bindViewTap: function(e) {
// 会自动转成驼峰式命名
console.log(e.taget.dataset.testMsg) // 啦啦啦啦啦啦
}
})
~~~
## 目前踩过的坑
### 事件绑定中 `e.target.dataset`
当在父组件绑定事件和参数,点击时又子组件冒泡事件到父组件,这个时候 `e.target.dataset` 为空
~~~
<view bindtap="bindViewTap" data-test-msg="啦啦啦啦啦啦" class="userinfo">
<view><text>tap</text></view>
</view>
~~~
~~~
Page({
bindViewTap: function(e) {
console.log(e.taget.dataset.testMsg) // undefined
}
})
~~~
### 在线图片加载不稳定
在知乎日报这个项目上有大量图片需要从网上下载,这里 image 组件额显示显得极其不稳定,有很多的图片都显示不出来.
## 最后
微信小程序现在还在内测阶段,有很多的问题需要完善,不过对于开发速度和体验来说还是不错的,期待正式发布的那一天。
## 资源
* [官方文档](https://mp.weixin.qq.com/debug/wxadoc/dev/?t=1474644083132)
* [开发工具下载](https://mp.weixin.qq.com/debug/wxadoc/dev/devtools/download.html?t=1474644089359)
* [awesome-wechat-weapp](https://github.com/Aufree/awesome-wechat-weapp)
- PHP学习
- PHP应用
- PHP函数总结整理
- 39个对初学者非常有用的PHP技巧
- 深入浅出之Smarty模板引擎工作机制
- 数组操作
- file操作的常用方法
- PHP字符串输出之Heredoc说明
- require(_once)和include(_once)的理解
- PHP提高效率的几点
- php无限遍历目录
- 53个要点提高PHP编程效率
- THINKPHP
- THINKPHP 常见的问题
- 微信
- 微信公众号接口
- 微信小程序开发资料收集
- 微信小程序开发:MINA
- 通过微信小程序看前端
- 微信小程序开发初体验
- 微信小程序 Demo(豆瓣电影)
- API应用
- 支付宝
- 二维码转换
- 前端开发
- HTML5
- CSS
- 七种css方式让一个容器水平垂直居中
- JavaScript
- JavaScript奇技淫巧44招
- JavaScript笔记
- 后端开发
- Node
- SQL数据库
- 服务维护
- git使用
- Git入门私房菜
- MAC终端维护
- VIM命令大全
- 开发规范
- 智能手机屏幕的秘密
- 超实用六步透视网易设计规范(附完整PDF下载)
- UI设计常用字体规范
- APP界面切图命名和文件整理规范
- 网页UI视觉设计规范
- ios视觉设计规范说明
- 开发APP时需要注意的原则
- 移动端APP设计初步入门
- Axure
- 基础操作
- 基础1-10
- 基础11-20
- 基础21-30
- 基础31-40
- 基础41-50
- 基础51-60
- Sketch
- 软件使用
- sublime3_用户设置
- sublime下如何修改自动补全 后lang=zh-cn?
- 运营理念
- 新人指导心得体会
- 从一次活动设计,聊聊交互设计师的3个阶段
- 详情页优化那些不得不说的细节
- 店铺装修浅析
- 淘宝店铺装修之宝贝详情页的布局教程
- 宝贝详情页 客户需求调研及总结
- 宝贝描述样板房