本次DEMO预览
抓取豆瓣的页面,演示基本组件的用法
对于程序猿来说,小程序是什么
张小龙:”不需要下载安装即可使用的应用…应用将无处不在,随时可用,但又无需安装卸载”
当前阶段小程序的限制
规定的目录结构
文件类型
设计规范和自适应尺寸单位
js文件的包管理
页面导航
//跳到目标页,并传递参数 wx.navigateTo({ url: `../video/video?v_url=${url}` }); ... //在目标页接受参数 onLoad(option) { console.log(option.v_url); },
网络请求
wx.request发起的是 HTTPS 请求。一个微信小程序,同时只能有5个网络请求连接
wx.request({ url, data: [Object|String], method: 'GET', header: { 'Content-Type': 'text/html; charset=utf-8' }, success: res=>console.log(res.data), fail: [Function], complete: [Function] })
开发工具
编辑界面:
自动完成:
调试界面:
项目界面:
开发细节
用app.js注册程序
App({ onLaunch: function() { // 生命周期函数--监听小程序初始化 }, onShow: function() { // 生命周期函数--监听小程序显示 }, onHide: function() { // 生命周期函数--监听小程序隐藏 }, xxx: '自定义函数或数据' })
在页面中调用全局的 getApp() 函数,可以获取到小程序实例
用app.json配置全局
{ "pages":[ "pages/movies/movies", "pages/video/video", "pages/movies_later/movies" ], "window":{ "backgroundTextStyle":"dark", "backgroundColor":"#fff", "navigationBarBackgroundColor":"#036bc4", "navigationBarTitleText":"小程序demo-豆瓣电影", "navigationBarTextStyle":"white", "enablePullDownRefresh":"false" }, "tabBar":{ "position": "bottom", "backgroundColor": "#fff", "selectedColor": "#036bc4", "color": "#000", "list": [{ "pagePath": "pages/movies/movies", "text": "正在热映", "selectedIconPath": "img/icon1.gif", "iconPath": "img/icon1.gif" }, { "pagePath": "pages/movies_later/movies", "text": "即将上映", "selectedIconPath": "img/icon2.gif", "iconPath": "img/icon2.gif" }] } }
集中定义网络请求等工具方法
小程序开发中,一般把网络请求、全局工具方法等,集中定义在 utils 文件夹中
视图层模板-.wxml文件
<view class="movies" catchtap="onPageClick"> <view class="page-title" wx:if="{{movies.length}}"> 共有{{movies.length}}部电影正在热映: </view> <scroll-view scroll-y="true" style="height:{{scrollHeight}}px" bindscrolltoupper="onToUpper"> <view class="page-main"> <block wx:for="{{movies}}" wx:for-item="item" wx:key="movie"> <view class="box"> <view class="pic" id="pic_{{item.id}}" catchtap="onGallaryClick"> <image src="{{item.image}}"></image> </view> <view class="info"> <view class="title ellipsis">{{item['data-title']}}</view> <view class="others"> <view class="line ellipsis">评分:{{item['data-score']}}</view> <view class="line ellipsis">演员:{{item['data-actors']}}</view> <view class="line ellipsis">上映:{{item['data-release']}}</view> </view> <view class="btns"> <button type="primary" size="mini" id="btn_{{item.id}}" catchtap="onSummaryClick">简介</button> <button type="default" size="mini" id="play_{{item.id}}" catchtap="onVideoClick">预告片</button> </view></view></view></block></view></scroll-view></view>
用.js文件管理页面逻辑
import req from '../../utils/request'; Page({ _cache: [], data: { movies: [], scrollHeight: 0 }, onLoad() { this.fetchData(); }, onShow: function () { wx.getSystemInfo({ success: res=>{ let topH = 60; //顶部区域高度 let rpx = topH*(res.windowWidth/750); //rpx转px 屏幕宽度/750 this.setData({ scrollHeight: parseInt(res.windowHeight - rpx) }); } }); }, fetchData() { if (this._cache.length) { this.setData({movies: this._cache}); return; }; req.get_movies('nowplaying', movies=>{ console.log('movies: ', movies); this._cache = movies; this.setData({movies}) }); }, _eventTS: null, onSummaryClick(e) { if (e.timeStamp === this._eventTS) return; this._eventTS = e.timeStamp; req.get_summary(e.currentTarget.id.replace('btn_', ''), summary=>{ wx.showModal({ title: '简介', content: summary }); }); }, onGallaryClick(e) { if (e.timeStamp === this._eventTS) return; this._eventTS = e.timeStamp; req.get_gallary(e.currentTarget.id.replace('pic_', ''), urls=>{ wx.previewImage({ urls }); }); }, onVideoClick(e) { if (e.timeStamp === this._eventTS) return; this._eventTS = e.timeStamp; req.get_video(e.currentTarget.id.replace('play_', ''), url=>{ console.log('video playing...', url); wx.navigateTo({ url: `../video/video?v_url=${url}` }); }); } });
用.wxss定义局部样式
.page-title { color: rgb(142, 142, 142); font-size: 30rpx; line-height: 60rpx; height: 60rpx; } .page-main { display: flex; flex-direction: row; flex-wrap: wrap; justify-content: space-between; align-items: flex-start; } .box { overflow: hidden; width: 48.5%; display: inline-flex; flex-direction: row; margin-bottom: 15rpx; } ... .info .others .line { align-items: center; width: 200rpx; }
DEMO源码
https://github.com/tonylua/wxapp-doubanmovie-demo
参考资料