|
導(dǎo)讀微信小程序,簡稱小程序,英文名Mini Program,是一種不需要下載安裝即可使用的應(yīng)用,它實(shí)現(xiàn)了應(yīng)用“觸手可及”的夢(mèng)想,用戶掃一掃或搜一下即可打開應(yīng)用。小程序是一種不用下載就能使用的應(yīng)用,也是一... 微信小程序,簡稱小程序,英文名Mini Program,是一種不需要下載安裝即可使用的應(yīng)用,它實(shí)現(xiàn)了應(yīng)用“觸手可及”的夢(mèng)想,用戶掃一掃或搜一下即可打開應(yīng)用。小程序是一種不用下載就能使用的應(yīng)用,也是一項(xiàng)門檻非常高的創(chuàng)新,經(jīng)過將近兩年的發(fā)展,已經(jīng)構(gòu)造了新的小程序開發(fā)環(huán)境和開發(fā)者生態(tài)。 本篇文章主要介紹了微信小程序之小豆瓣圖書實(shí)例,具有一定的參考價(jià)值,有興趣的同學(xué)可以了解一下。最近微信小程序被炒得很火熱,本人也抱著試一試的態(tài)度下載了微信web開發(fā)者工具,開發(fā)工具比較簡潔,功能相對(duì)比較少,個(gè)性化設(shè)置也沒有。了解完開發(fā)工具之后,順便看了一下小程序的官方開發(fā)文檔,大概了解了小程序的開發(fā)流程和一些常用的API。 了解了小程序之后,自己就有了想要做一個(gè)小demo的沖動(dòng),雖然自己對(duì)小程序還沒有做過很多實(shí)踐,只是在官方例子上徘徊,但是還是想做出點(diǎn)小東西。既然要做一個(gè)demo,自然需要到數(shù)據(jù),自己有又不想獨(dú)自搭建服務(wù)端,所以在網(wǎng)上搜索可以用來提供測(cè)試數(shù)據(jù)的免費(fèi)api,最后我選擇了豆瓣圖書。豆瓣圖書提供的api功能比較少,加上不開放appkey申請(qǐng),所以無法操作用戶數(shù)據(jù)。只能做點(diǎn)簡單的圖書查詢和圖書詳細(xì)信息展示,這個(gè)demo只有兩個(gè)頁面,非常之簡單。 豆瓣圖書API demo中用到的豆瓣圖書api只有兩個(gè),一個(gè)是圖書搜索,另一個(gè)是獲取圖書詳情。 搜索圖書 GET https://api.douban.com/v2/book/search
返回status=200 {
"start": 0,
"count": 10,
"total": 30,
"books" : [Book, ...]
}獲取圖書詳情 GET https://api.douban.com/v2/book/:id
以下是具體圖書的詳情信息,部分demo中用不到的信息省略 {
"id":"1003078",
"title":"小王子",
"alt":"https:\/\/book.douban.com\/subject\/1003078\/",
"image":"https://img3.doubanio.com\/mpic\/s1001902.jpg",
"author":[
"(法)圣埃克蘇佩里"
],
"publisher":"中國友誼出版公司",
"pubdate":"2000-9-1",
"rating":{"max":10,"numRaters":9438,"average":"9.1","min":0},
"author_intro":"圣埃克蘇佩里(1900-1944)1900年,瑪雅·戴斯特萊姆......",
"catalog":"序言:法蘭西玫瑰\n小王子\n圣埃克蘇佩里年表\n"
}Demo編寫 創(chuàng)建項(xiàng)目 項(xiàng)目取名為DouBanBookApp,項(xiàng)目的結(jié)構(gòu)小程序默認(rèn)的結(jié)構(gòu)一樣 DouBanBookApp
pages
index 首頁
index.js
index.wxml
index.wxss
detail 詳情頁
detail.js
detail.wxml
detail.wxss
requests
api.js API地址
request.js 網(wǎng)絡(luò)請(qǐng)求
utils
util.js 工具
app.js
app.json
app.wxss應(yīng)用的主調(diào)色參考了豆瓣app的色調(diào),采用了偏綠色。 首頁 首頁頂部展示搜索輸入框,用戶輸入圖書名稱,點(diǎn)擊搜索按鈕,展示圖書列表。圖書可能會(huì)很多,不能一下子全部展示,需要用到分頁,app上最常見的列表分頁就是上拉加載模式,根據(jù)小程序提供的組件中,找到了一個(gè)比較符合場(chǎng)景的scroll-view組件,這個(gè)組件有一個(gè)上拉到底部自動(dòng)觸發(fā)的bindscrolltolower事件。 先制作出界面的靜態(tài)效果,之后再整合API,由于本人對(duì)界面設(shè)計(jì)不敏感,所以隨便弄了一個(gè)粗糙的布局,看得過去就行了,嘿嘿~~ index.wxml <view class="search-container">
<input type="text" placeholder="輸入書名搜索"></input><icon type="search" size="20"/>
</view>
<scroll-view scroll-y="true" style="width:100%;position:relative;top:40px;height:200px">
<view style="text-align:center;padding-top:50rpx;">
<icon type="cancel" color="red" size="40" />
<view><text>沒有找到相關(guān)圖書</text></view>
</view>
<view style="text-align:center;padding-top:50rpx;">
<icon type="search" size="60" />
<view><text>豆瓣圖書</text></view>
</view>
<view class="header">
<text>圖書 10本圖書</text>
</view>
<view class="common-list">
<view class="list-item">
<view class="index-list-item">
<view class="cover">
<image class="cover-img" src="images/demo.png"></image>
</view>
<view class="content">
<view class="title">圖書標(biāo)圖</view>
<text class="desc">9.0/oopsguy/2016-07-08</text>
</view>
</view>
</view>
</view>
<view class="refresh-footer">
<icon type="waiting" size="30" color="reed" />
</view>
</scroll-view>index.wxss page {
background: #F2F1EE;
}
/*seach*/
.search-container {
position: fixed;
top: 0;
right: 0;
left: 0;
background-color: #42BD56;
color: #FFF;
height: 40px;
padding: 0 10rpx;
z-index: 100;
}
.search-container input {
background: #FFF;
color: #AAA;
margin-top: 5px;
padding: 5px 10rpx;
height: 20px;
border-radius: 8rpx;
}
.search-container icon {
position: absolute;
top: 10px;
right: 20rpx;
}
/*header*/
.header {
padding: 20rpx 30rpx;
}
.header text {
color: #A6A6A6;
}
/*common list*/
.list-item {
position: relative;
overflow: hidden
}
/*index list*/
.index-list-item {
background: #FFF;
padding: 15rpx 30rpx;
overflow: hidden;
}
.index-list-item::active {
background: #EEE;
}
.index-list-item .cover {
float: left;
width: 120rpx;
height: 160rpx;
overflow: hidden
}
.index-list-item .cover image.cover-img {
width: 120rpx;
height: 160rpx;
}
.index-list-item .content {
margin-left: 140rpx;
}
.index-list-item .title {
display: inline-block;
height: 90rpx;
padding-top: 20rpx;
overflow: hidden;
}
.index-list-item .desc {
display: block;
font-size: 30rpx;
padding-top: 10rpx;
color: #AAA;
white-space:nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.refresh-footer {
text-align: center;
padding: 10rpx 0;
}圖書詳細(xì)頁面 圖書詳細(xì)頁面就是展示具體的圖書信息,通用首頁穿過了的圖書id來獲取圖書信息之后在展示出來,獲取的過程中可能有延遲,需要一個(gè)加載效果來過渡。 detail.wxml <view>
<view class="cover-container">
<image src="images/demo.png"></image>
</view>
<view class="book-meta">
<view class="meta-info">
<text class="book-title">圖書標(biāo)題</text>
<text class="other-meta">作者:作者名稱</text>
<text class="other-meta">出版社:xxx出版社</text>
<text class="other-meta">出版日期:2010-05-07</text>
</view>
<view class="range">
<text class="score">0</text>
<text class="viewers">0</text>
</view>
</view>
<view class="book-intro">
<view class="intro-header"><text>簡介</text></view>
<text class="intro-content">
這是圖書簡介
</text>
</view>
<view class="book-intro">
<view class="intro-header"><text>作者</text></view>
<text class="intro-content">
這是作者簡介
</text>
</view>
</view>
<loading>
加載中...
</loading>detail.wxss page {
background: #EEE;
}
.cover-container {
background: #42BD56;
text-align: center;
padding: 50rpx 0;
}
.cover-container image {
display: inline-block;
width: 300rpx;
height: 400rpx;
}
.book-meta {
position: relative;
padding: 20rpx;
overflow: hidden;
}
.book-meta .range {
position: absolute;
top: 30rpx;
right: 20rpx;
width: 180rpx;
background: #FFF;
padding: 20rpx 10rpx;
text-align: center;
box-shadow: 2px 2px 10px #CCC;
}
.book-meta .meta-info {
margin-right: 200rpx;
}
.meta-info text {
display: block
}
.book-title {
font-weight: bold;
font-size: 50rpx;
}
.other-meta {
padding-top: 10rpx;
color: #888;
font-size: 30rpx;
}
.range text {
display: block;
}
.range .score {
font-size: 50rpx;
font-weight: bold;
}
.range .starts {
font-size: 40rpx;
}
.range .viewers {
font-size: 30rpx;
}
.book-intro {
padding: 20rpx;
font-size: 40rpx;
}
.book-intro .intro-header {
color: #888
}
.book-intro .intro-content {
font-size: 35rpx;
line-height: 45rpx;
}做好了首頁和詳細(xì)頁的靜態(tài)頁面,接下來就是通過網(wǎng)絡(luò)請(qǐng)求api來獲取數(shù)據(jù),并顯示到頁面上來。 網(wǎng)絡(luò)請(qǐng)求和數(shù)據(jù)處理 為了更好的管理api,我把a(bǔ)pi專門放到了一個(gè)單獨(dú)的api.js文件中 api.js const API_BASE = "https://api.douban.com/v2/book";
module.exports = {
API_BOOK_SEARCH: API_BASE + "/search",
API_BOOK_DETAIL: API_BASE + "/:id"
}有些經(jīng)常用到的工具函數(shù)放到了util.js中 util.js function isFunction( obj ) {
return typeof obj === 'function';
}
module.exports = {
isFunction: isFunction
}微信小程序提供了一個(gè)用于網(wǎng)絡(luò)請(qǐng)求的api:wx.request(OBJECT),具體的參數(shù)跟jquery的ajax方法差不多,為了方便調(diào)用,我把網(wǎng)絡(luò)請(qǐng)求放到了request.js中 request.js var api = require('./api.js');
var utils = require('../utils/util.js');
/**
* 網(wǎng)路請(qǐng)求
*/
function request(url, data, successCb, errorCb, completeCb) {
wx.request({
url: url,
method: 'GET',
data: data,
success: function(res) {
utils.isFunction(successCb) && successCb(res.data);
},
error: function() {
utils.isFunction(errorCb) && errorCb();
},
complete: function() {
utils.isFunction(completeCb) && completeCb();
}
});
}
/**
* 搜索圖書
*/
function requestSearchBook(data, successCb, errorCb, completeCb) {
request(api.API_BOOK_SEARCH, data, successCb, errorCb, completeCb);
}
/**
* 獲取圖書詳細(xì)信息
*/
function requestBookDokDetail(id, data, successCb, errorCb, completeCb) {
request(api.API_BOOK_DETAIL.replace(':id', id), data, successCb, errorCb, completeCb);
}
module.exports = {
requestSearchBook: requestSearchBook,
requestBookDokDetail: requestBookDokDetail
}首頁有圖書搜索和列表展示,上拉加載的效果。微信小程序中沒有了DOM操作的概念,一切的界面元素的改變都要通過數(shù)據(jù)變化來改變,所以需要在js中的Page中的data中聲明很多數(shù)據(jù)成員。 用戶在輸入數(shù)據(jù)時(shí),輸入框的input綁定了searchInputEvent事件,就回捕獲到輸入的數(shù)據(jù),把輸入的數(shù)據(jù)更新的data中的searchKey中。 searchInputEvent: function( e ) {
this.setData( { searchKey: e.detail.value });
}當(dāng)點(diǎn)擊搜索按鈕是,觸發(fā)tap事件,其綁定了searchClickEvent searchClickEvent: function( e ) {
if( !this.data.searchKey )
return;
this.setData( { pageIndex: 0, pageData: [] });
requestData.call( this );
}requestData中封裝了請(qǐng)求圖書列表的方法 /**
* 請(qǐng)求圖書信息
*/
function requestData() {
var _this = this;
var q = this.data.searchKey;
var start = this.data.pageIndex;
this.setData( { loadingMore: true, isInit: false });
updateRefreshBall.call( this );
requests.requestSearchBook( { q: q, start: start }, ( data ) => {
if( data.total == 0 ) {
//沒有記錄
_this.setData( { totalRecord: 0 });
} else {
_this.setData( {
pageData: _this.data.pageData.concat( data.books ),
pageIndex: start + 1,
totalRecord: data.total
});
}
}, () => {
_this.setData( { totalRecord: 0 });
}, () => {
_this.setData( { loadingMore: false });
});
}上拉加載的效果是一個(gè)小球不停的變換顏色,需要一個(gè)顏色列表 //刷新動(dòng)態(tài)球顏色 var iconColor = [ '#353535', '#888888' ]; 然后用一個(gè)定時(shí)器來動(dòng)態(tài)改變小球圖標(biāo)的顏色 /**
* 刷新上拉加載效果變色球
*/
function updateRefreshBall() {
var cIndex = 0;
var _this = this;
var timer = setInterval( function() {
if( !_this.data[ 'loadingMore' ] ) {
clearInterval( timer );
}
if( cIndex >= iconColor.length )
cIndex = 0;
_this.setData( { footerIconColor: iconColor[ cIndex++ ] });
}, 100 );
}詳細(xì)頁面的顯示需要到首頁點(diǎn)擊了具體圖書的id,所以需要首頁傳值過來,這里用到了小程序土工的wx.navigateTo方法,給其指定的url參數(shù)后面帶以查詢字符串格式形式的參數(shù),被跳轉(zhuǎn)的頁面就會(huì)在onLoad方法中得到值。 //跳轉(zhuǎn)到詳細(xì)頁面
toDetailPage: function( e ) {
var bid = e.currentTarget.dataset.bid; //圖書id [data-bid]
wx.navigateTo( {
url: '../detail/detail?id=' + bid
});
}detail.js中接受參數(shù) onLoad: function( option ) {
this.setData({
id: option.id
});
}其實(shí)小程序的頁面制作跟平時(shí)的html和css差不多,只是頁面中不能用傳統(tǒng)的html標(biāo)簽,而是改用了小程序提供的自定義標(biāo)簽,小程序?qū)ss的支持也有限制,注意哪些寫法不兼容也差不多懂了。操作頁面變化是通過數(shù)據(jù)變化來表現(xiàn)出來的,這點(diǎn)有點(diǎn)像react和vue。以上的demo用到的知識(shí)點(diǎn)并不多,主要是頁面的數(shù)據(jù)綁定、事件綁定、模版知識(shí)和網(wǎng)絡(luò)請(qǐng)求等相關(guān)api。仔細(xì)看看文檔也差不多可以做出一個(gè)小例子。 最終效果圖 總體來說,Demo很簡單,只有兩個(gè)頁面,界面也是丑丑的T_T,算是我入門小程序的第一課吧。 示例代碼
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,更多相關(guān)內(nèi)容請(qǐng)關(guān)注PHP中文網(wǎng)! 相關(guān)推薦: 微信小程序使用radio顯示單選項(xiàng)功能【附源碼】 以上就是微信小程序之小豆瓣圖書的介紹的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章! 小程序是一種不需要下載安裝即可使用的應(yīng)用,它實(shí)現(xiàn)了應(yīng)用“觸手可及”的夢(mèng)想,用戶掃一掃或者搜一下即可打開應(yīng)用。 |
溫馨提示:喜歡本站的話,請(qǐng)收藏一下本站!