微信小程序> 从0开始写一个小程序

从0开始写一个小程序

浏览量:444 时间: 来源:韩宗金

项目简介

从0开始写一个小程序,本来想写一个新闻类的程序,后来发现调用的聚合数据api每天只能访问100次,就换成豆瓣的了,直接用豆瓣的接口又访问不了,在网上查了一下,要把豆瓣的地址换成“http://t.yushu.im”才能访问,所以电影和图书用的豆瓣的接口,音乐用的是百度音乐的接口。主要分三个部分,一个是电影,一个是图书,一个是音乐。主要功能包括分享功能,电影主要包括列表和焦点图轮播,其他图书和音乐界面只包括列表,对于详情页,因为api数据问题,没有现成的接口做详情页,所以做了三个演示详情页,一个是演示怎么加载html格式的字符串,并且在界面上显示,一个是演示播放音乐,一个是演示播放电影。主要图片如下:

小程序
小程序
小程序
小程序

项目搭建

首先新建一个小程序项目,基本上需要6个界面,可以在app.json文件中,写入需要创建的文件,点击保存,工具会自动将文件创建好,代码如下:

"pages":[    "pages/index/index",    "pages/lista/lista",    "pages/listb/listb",    "pages/view0/view0",    "pages/view/view",    "pages/view2/view2",    "pages/logs/logs"  ]

这样项目中就会创建出需要的文件,
小程序
然后搭建三个tab,分别是电影,图书,娱乐,tab的创建,可以查看小程序api中配置部分(https://mp.weixin.qq.com/debug/wxadoc/dev/framework/config.html),
小程序
小程序
另外,分享一个网页,可以在里边搜索一些icon,方便开发(http://www.iconfont.cn/),我在这个网上搜索了一些图片,作为tab的iconPath和selectedIconPath,在项目中创建一个image文件夹,将下载下来的文件放在文件夹中,如图:
小程序
在app.json中创建tab:

 "tabBar":{    "color":"#8a8a8a",    "selectedColor":"#d81e06",    "list":[      {        "pagePath": "pages/index/index",        "text": "电影",        "iconPath": "image/listaD.png",        "selectedIconPath": "image/listaS.png"      },      {      "pagePath":"pages/lista/lista",      "text":"图书",      "iconPath":"image/indexD.png",      "selectedIconPath":"image/indexS.png"    },    {      "pagePath": "pages/listb/listb",      "text": "音乐",      "iconPath": "image/listbD.png",      "selectedIconPath": "image/listbS.png"    }]  }

然后对navigationBar进行定制,也是在app.json中:

 "window":{    "backgroundTextStyle":"light",    "navigationBarBackgroundColor": "#000",    "navigationBarTitleText": "电影",    "navigationBarTextStyle":"white",    "enablePullDownRefresh":true,    "backgroundTextStyle":"dark"  },

小程序
有一个属性:enablePullDownRefresh,这个设置为true可以开启下拉刷新功能,backgroundTextStyle设置下拉刷新时怎么显示。navigationBar可以在不同的界面进行定制,比如在图书模块,在图书模块的json中设置:

{  "navigationBarTitleText": "图书"}

在音乐模块的json中设置:

{  "navigationBarTitleText": "音乐"}

电影

现在开始写电影页面,这个主要包括三个功能,一个是焦点图轮播,一个是列表,包括列表拉到底部显示加载图标,加载数据,还有分享功能
首先是焦点图轮播,焦点图需要用到swiper,这个使用方法具体查看官方文档(https://mp.weixin.qq.com/debug/wxadoc/dev/component/swiper.html),
小程序开发,.wxml和.js文件进行通信,在.js中,通过data定义变量,如果要改变变量值,需要使用 setData方法来赋值,在wxml中,通过{{变量}}来调用,对于方法通信,在.wxml中,在控件中,通过bindtap=”方法名”定义,在js中,通过 方法名: function(e) {}来响应。对于界面样式,在wxml的控件中,定义class属性,在.wxss中,通过.class名来设置样式
1.设置焦点图:
在index.wxml中:

swiper indicator-dots='{{indicatorDots}}' autoplay='{{autoplay}}' interval='{{interval}}' duration='{{duration}}' circular='{{circular}}'  block wx:for='{{imageUrls}}'    swiper-item      navigator url='/pages/view0/view0'        image src='{{item.images.large}}'/image      /navigator    /swiper-item  /block/swiper

解释一下这段代码:
{{}}包括的是变量,可以在index.js中进行设置,wx:for是列表渲染,官方解释:

wx:for在组件上使用 wx:for 控制属性绑定一个数组,即可使用数组中各项的数据重复渲染该组件。默认数组的当前项的下标变量名默认为 index,数组当前项的变量名默认为 itemview wx:for="{{array}}"  {{index}}: {{item.message}}/viewPage({  data: {    array: [{      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}}/viewwx:for 也可以嵌套,下边是一个九九乘法表view wx:for="{{[1, 2, 3, 4, 5, 6, 7, 8, 9]}}" wx:for-item="i"  view wx:for="{{[1, 2, 3, 4, 5, 6, 7, 8, 9]}}" wx:for-item="j"    view wx:if="{{i = j}}"      {{i}} * {{j}} = {{i * j}}    /view  /view/viewblock wx:for类似 block wx:if,也可以将 wx:for 用在block/标签上,以渲染一个包含多节点的结构块。例如:block wx:for="{{[1, 2, 3]}}"  view {{index}}: /view  view {{item}} /view/block

navigator是页面链接,就是点击一个控件,跳转到另一个页面,主要用法:
小程序
注意:url属性可以带一些值,比如:

navigator url="/page/navigate/navigate?id=navigate" hover-class="navigator-hover"跳转到新页面/navigator

跳转到新页面时,可以在console中查看到传入的值:

onLoad:function(e){    // 页面初始化 options为页面跳转所带来的参数    console.log(e.id)    }

这一点很重要,因为有的时候,跳转到的页面,需要上一个页面的数据作为参数调用接口,设置值之类的操作,类似于安卓中的Intent
index.js中设置焦点图的对应的代码:

 //初始化数据  data: {    imageUrls:{},    newsList:{},    page:1,    loading:false,    indicatorDots: false,    autoplay: true,    interval: 5000,    duration: 1000,    circular:true  },  //加载时的操作  onLoad: function () {    console.log("加载时触发");    var that = this;    //顶部图片轮播调用的数据    wx.request({      url: 'http://t.yushu.im/v2/movie/in_theaters',       method:"GET",      success: function (res) {        that.setData({          imageUrls: res.data.subjects        })      }    })

首先定义一个变量,imageUrls,然后通过 wx.request调用数据,将获取的数据给imageUrls赋值,然后index.wxml中{{imageUrls}}就可以使用js中imageUrls的值了。

开始做列表功能,列表同样需要用到wx:for进行循环,将数据显示在界面上,对应代码:

block wx:for='{{newsList}}'  navigator class='listWrap' url='/pages/view0/view0'    image class='listThumb' src='{{item.images.large}}'/image    view class='listInfo'      view class='listTitle'{{item.original_title}}/view      view class='listKeyAdd'        text class='addFN'{{item.year}}/text        text class='addKY'{{item.rating.average}}/text      /view    /view  /navigator/block

注意:控件中的class,是为了对控件好进行操作,这里要对控件设置布局,在index.wxss中进行设置:

/*优化后的样式*/swiper-item image {  width:750rpx;}.listWrap {  width:705rpx;  padding:0 25rpx;  padding:30rpx 25rpx;  border-bottom:1px solid #e5e5e5;}.listThumb {  width:260rpx;  height:160rpx;  display:block;  float:left;}.listInfo {  height:160rpx;  width:435rpx;  display:inline-block;  padding-left:10rpx;  position: relative;}.listTitle {  color:#333;  font-size:36rpx;  font-weight:600;}.listKeyAdd {  font-size:30rpx;  position: absolute;  bottom: 0;  width:100%;}.addFN {  color: #808080;  display:block;  float:left;}.addKY {  color: #d9c599;  float:right;  display:block;  margin-right:15rpx;}

rpx单位是微信小程序中css的尺寸单位,rpx可以根据屏幕宽度进行自适应。规定屏幕宽为750rpx。如在 iPhone6 上,屏幕宽度为375px,共有750个物理像素,则750rpx = 375px = 750物理像素,1rpx = 0.
下拉列表,界面到达底部,有一个onReachBottom方法进行监听,可以在这个方法里,进行一些分页加载之类的操作
index.js中列表操作的代码:

 //列表调用的数据    wx.request({      url: 'http://t.yushu.im/v2/movie/top250',      data: {        start: that.data.page,        count:10      },      method: "GET",      success: function (res) {        console.log(res)        that.setData({          newsList: res.data.subjects        })      }    }) /*页面上拉触底事件的处理函数 演示滑到底部加载新数据*/  onReachBottom:function(e){    var that = this    that.setData({      //界面滑到底部,页面加1      page:++that.data.page,      loading:true    })    console.log(that.data.page);    wx.request({      url: 'http://t.yushu.im/v2/movie/top250',      data: {        start: that.data.page,        count: 10      },      method: "GET",      success: function (res) {        loading:false        that.setData({          //获取到数据,将新获取的数据加在原有数据的后边          newsList: that.data.newsList.concat(res.data.subjects)        })      }    })  }

在原来数据基础上加上新的数据,需要通过concat方法

分享功能:
默认情况下,点击右上角的三点图标,会提示没有配置分享,如果要实现分享,需要通过onShareAppMessage方法,对应的使用说明(https://mp.weixin.qq.com/debug/wxadoc/dev/api/share.html),对应的代码:

 //分享  onShareAppMessage: function (res) {    return {      title: "电影",      path: "pages/index/index",      success: function (res) {        wx.showToast({          title: "转发成功" + res.errMsg,          icon: 'success',          duration: 2000        })      },      fail: function (res) {        console.log(res);        wx.showToast({          title: "失败:" + res.errMsg,          icon: 'none',          duration: 2000        })      }    }

显示瞬时提示,需要通过wx.showToast方法(https://mp.weixin.qq.com/debug/wxadoc/dev/api/api-react.html#wxshowtoastobject)。
在列表底部,需要一个加载的loading,具体设置:

block wx:if="{{loading}}"    image class='loading' src='/image/loading.png'/image/block

这个用到了wx:if,条件渲染(https://mp.weixin.qq.com/debug/wxadoc/dev/framework/view/wxml/conditional.html),在js中设置loading的值,控制loading图标是否显示,需要在wxss中设置样式

@-webkit-keyframes rotation{from {-webkit-transform: rotate(0deg);}to {-webkit-transform: rotate(360deg);}}.loading {-webkit-transform: rotate(360deg);animation: rotation 1.5s linear infinite;-moz-animation: rotation 1.5s linear infinite;-webkit-animation: rotation 1.5s linear infinite;-o-animation: rotation 1.5s linear infinite;width:60rpx;height:60rpx;display:block;margin:10rpx auto;}

index.js全部代码:

//index.js//获取应用实例const app = getApp()Page({  //初始化数据  data: {    imageUrls:{},    newsList:{},    page:1,    loading:false,    indicatorDots: false,    autoplay: true,    interval: 5000,    duration: 1000,    circular:true  },  //加载时的操作  onLoad: function () {    console.log("加载时触发");    var that = this;    //顶部图片轮播调用的数据    wx.request({      url: 'http:

版权声明

即速应用倡导尊重与保护知识产权。如发现本站文章存在版权问题,烦请提供版权疑问、身份证明、版权证明、联系方式等发邮件至197452366@qq.com ,我们将及时处理。本站文章仅作分享交流用途,作者观点不等同于即速应用观点。用户与作者的任何交易与本站无关,请知悉。

产品经理

手机 : 13312967497

擅长 : 小程序流量变现

扫码领取礼包

热门模板

  • 头条
  • 搜狐
  • 微博
  • 百家
  • 一点资讯
  • 知乎