微信小程序开发,快捷方便,容易上手,学习成本不高,但是好的程序员必须要经常开发来积攒经验才为上策。在我的微信小程序上手篇中,笔者把微信小程序的demo通读了一遍,可以说收获良多,很多东西只有在自己理解的情况下才能牢牢记住,在文章的最后一篇中笔者也说了,学会了就得举一反三,通过现有的知识做出能力范围内可以实现的东西,这对于开发者来说是最好的实践。因此笔者在这里特别推出一个初级教程,而其中的知识基本上都是在demo中就可以获得的,只要你通读了我之前的文章,我相信你也能开发出一个简单的小程序。
好了,废话不多说,先上小程序示例的效果图:
由于demo能学到的有限,笔者暂时能想出来的实例就是类似这样的应用,不过技术都是一步一步增长的,从小做起,然后才能强大。
前期准备:
1.准备好图片,百度搜索多的是。
2.准备好json格式内容,我们的内容是以json形式存储的。
笔者是一名app开发,本想以json格式文件存储模型,但是一直找不到好的读取项目中本地json的方法,如有所知,能够评论告诉笔者,笔者先在此谢过。
这里笔者给大家一份自己写的json,仅供参考:
[
{"url":"http://www.huizhou.cn/food/rdtj/201211/W020121126369710784664.jpg",
"name":"猪肉",
"price":"32.4"},
{"url":"http://www.sc115.com/wenku/uploads/allimg/131201/214G63238-0.jpg",
"name":"水果",
"price":"17.5"},
{"url":"http://img1.gtimg.com/jiangsu/pics/hv1/78/113/1901/123641418.jpg",
"name":"蔬菜",
"price":"10.2"},
{"url":"http://image.enmuo.com/CMS/2011/12/12/1/CMS_111212141009773_0E_400x267.jpg",
"name":"玩具",
"price":"50.1"},
{"url":"http://pic.58pic.com/58pic/15/68/58/80Q58PIC2Yz_1024.jpg",
"name":"电脑",
"price":"4500.2"}
]
做好前期准备,就正式进入敲代码阶段。
首先创建项目,然后将项目中没有用的东西删除掉:
1.utils的文件夹删除,此项目用不到;
2.pages中的logs文件夹删除,此项目用不到;
3.app.js中删除无用代码,留下一个空白的onLaunch方法和空白的globalData对象,app.json中删除"pages/logs/logs","navigationBarTitleText"改为我们的“小型超市购物”,app.wxss中我们将padding改为50rpx 0;
4.index的每一个文件都清空;
我们先从app.js文件着手,此时你的代码应该和我的一样:
App({
onLaunch: function () {
},
globalData:{
}
})
getUserInfo:function(cb)
我们现在也写一个方法,名为getItem,用来获取我们商品的列表数据:
getItem : function (callback) {
},
globalData:{
items:null
}
if (this.globalData.items) {
typeof callback == "function" && callback(this.globalData.items)
}
else {
this.globalData.items = [
{"url":"http://www.huizhou.cn/food/rdtj/201211/W020121126369710784664.jpg",
"name":"猪肉",
"price":"32.4"},
{"url":"http://www.sc115.com/wenku/uploads/allimg/131201/214G63238-0.jpg",
"name":"水果",
"price":"17.5"},
{"url":"http://img1.gtimg.com/jiangsu/pics/hv1/78/113/1901/123641418.jpg",
"name":"蔬菜",
"price":"10.2"},
{"url":"http://image.enmuo.com/CMS/2011/12/12/1/CMS_111212141009773_0E_400x267.jpg",
"name":"玩具",
"price":"50.1"},
{"url":"http://pic.58pic.com/58pic/15/68/58/80Q58PIC2Yz_1024.jpg",
"name":"电脑",
"price":"4500.2"}
]
typeof callback == "function" && callback(this.globalData.items)
}
到这里,我们的app的代码都码好了,很简单,这里的逻辑只是让app公开一个方法回调,拿到我们设置的json(这里又可以举一反三,用请求同理)。接下来我们就要开始处理index文件了。
在文件中我们输入page,系统自动会给我们拼接上Page({...})代码,回车即可:
Page({
data:{
String1
},
onLoad:function(options){
// 生命周期函数--监听页面加载
String2
},
onReady:function(){
// 生命周期函数--监听页面初次渲染完成
String3
},
onShow:function(){
// 生命周期函数--监听页面显示
String4
},
onHide:function(){
// 生命周期函数--监听页面隐藏
String5
},
onUnload:function(){
// 生命周期函数--监听页面卸载
String6
},
onPullDownRefresh: function() {
// 页面相关事件处理函数--监听用户下拉动作
String7
},
onReachBottom: function() {
// 页面上拉触底事件的处理函数
String8
},
onShareAppMessage: function() {
// 用户点击右上角分享
return {
title: 'title', // 分享标题
desc: 'desc', // 分享描述
path: 'path' // 分享路径
}
}
})
Page({
data:{
String1
},
onLoad:function(options){
// 生命周期函数--监听页面加载
String2
}
})
在这里我们不需要options这个参数(这个参数后面会用到),删除即可。
现在来说一下逻辑,我们需要在这个首页显示的是一个列表,因此我要拿到数据来展示,而数据在app的实例中我们写了一个方法叫做getItem来获取,为了保存这个数据,我们需要一个变量来存储它,既然如此,我们先在data中设定一个存储用的变量:
data: {
items:[]
},
之后我们就要去获取它,很简单在onLoad方法中,我们去调用app的getItem方法,因此别忘了先获取app实例:
var app = getApp()
onLoad: function () {
var that = this
app.getItem(function(item){
that.setData({
items:item,
})
})
},
来到wxml中,我们需要一个大容器来展示数据:
我们首先要用一个view来承载一行一行的格子:
当然,这么简单是无法达成我们要的效果的,需要修改样式,在index.wxss中添加一个样式:
.item {
display: flex;
background-color: white;
flex-direction: row;
align-items: flex-start;
margin: 20rpx auto;
padding: 5rpx;
box-sizing: border-box;
border: 1px solid #d0d0d0;
border-radius: 2px;
width: 90%;
}
这步完成,大的框架已经搭好了,我们现在添加数据。首先添加商品名称,我希望序列号和商品名称显示在左上角:
{{index + 1}}.{{item.name}}
然后,我们需要添加我们的商品图片,没有图片顾客怎么浏览商品呢:
{{index + 1}}.{{item.name}}
现在看起来整个显示不够美观,商品名和图片紧贴在一起,图片太大,没事,我们添加样式就行:
.p{
padding-right:10rpx;
}
.image{
box-sizing: border-box;
border: 1px solid #d0d0d0;
width: 100px;
height: 80px;
background-color: 'white';
}
{{index + 1}}.{{item.name}}
好了,看上去美观多了是不是?最后我们把价格添加:
{{index + 1}}.{{item.name}}
{{item.price}} 元
这样子整体效果还不是特别好,我们继续添加样式:
.price{
line-height: 80px;
width: 50%;
text-align: center;
}
{{index + 1}}.{{item.name}}
{{item.price}} 元
差不多了,我们的长相看的过去了,现在我的需求变成了点击每一行进去可以看详情,所以我们得新建一个页面来显示详情,添加item的文件,.js .wxss .wxml创建好。
记得需要在app.json中配置我们的新页面,不然无法显示和添加页面:
"pages":[
"pages/index/index",
"pages/item/item"
],
itemTap: function (event){
}
我现在的需求是点击哪一行,哪一行的内容就要传到第二个页面,这样该如何实现呢?这个方法在demo中并没有体现,但是官方文档中有说明,在这里你们可以直接看我代码,在index.wxml中添加itemTap:
{{index + 1}}.{{item.name}}
{{item.price}} 元
在index.js中我们修改点击事件的代码:
itemTap: function (event){
var item = event.currentTarget.dataset.item
wx.navigateTo({
url: '../item/item?name=' + item.name + '&url=' + item.url + '&price=' + item.price,
})
}
这里传值在哪里接收呢,哈哈,这就要用到我们之前删除的options参数(往上拉,你会看到我说的参数)。
来到item.js,创建Page({...})代码:
Page({
data:{
String1
},
onLoad:function(options){
// 生命周期函数--监听页面加载
String2
}
})
Page({
data: {
item:{}
},
onLoad: function (options) {
this.setData({
item:options,
})
}
})
这样我们就获取了商品数据,然后我希望标题也能够变成商品的名字,虽然demo中没有用到这个方法,不过很幸运,系统正好给了这样一个接口:
wx.setNavigationBarTitle({
title: options.name,
})
{{item.name}}
{{item.price}} 元
.item {
align-items: center;
box-sizing: border-box;
border: 1px solid lightgrey;
border-radius: 5px;
margin: 0rpx 10rpx;
padding: 100rpx 0rpx 10rpx 10rpx;
background-color: lightcyan;
}
.image {
width: 100%;
}
.title {
border-bottom: 1px solid lightgray;
width: 80%;
line-height: 100px;
text-align: center;
}
.price {
line-height: 80px;
text-align: right;
width: 80%;
font-family: "YouYuan";
font-size: 30px;
font-weight: bold;
font-style:oblique;
}