菜单

微信小程序之小豆瓣图书实例

2019年6月27日 - 金沙前端
const API_BASE = "https://api.douban.com/v2/book";

module.exports = {
 API_BOOK_SEARCH: API_BASE + "/search",
 API_BOOK_DETAIL: API_BASE + "/:id"
}
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;
}

detail.wxml

图片 1

返回status=200

书本详细页面

图片 2

你或者感兴趣的稿子:

一体化来讲,德姆o相当粗略,只有三个页面,界面也是丑丑的T_T,算是笔者入门小程序的首先课吧。

GET https://api.douban.com/v2/book/:id

豆子图书API

详细页面包车型地铁展现必要到首页点击了切实图书的id,所以必要首页传值过来,这里运用了小程序土工的wx.navigateTo方法,给其钦点的url参数后边带以询问字符串格式方式的参数,被跳转的页面就能够在onLoad方法中获取值。

{
 "start": 0,
 "count": 10,
 "total": 30,
 "books" : [Book, ...]
}
searchInputEvent: function( e ) {
  this.setData( { searchKey: e.detail.value });
}

微信小程序提供了一个用以互连网恳求的api:wx.request(OBJECT),具体的参数跟jquery的ajax方法好多,为了方便调用,小编把互连网诉求放到了request.js中

detail.wxss

function isFunction( obj ) {
 return typeof obj === 'function';
}

module.exports = {
 isFunction: isFunction
}

类型取名字为DouBanBookApp,项目标布局小程序暗中同意的结构同样

搜求图书

先制作出分界面包车型的士静态效果,之后再整合API,由于小编对分界面设计不灵动,所以无论弄了三个粗糙的布局,看得过去就行了,嘿嘿~~

为了越来越好的治本api,小编把api专门放置了一个单身的api.js文件中

打听了小程序之后,本身就有了想要做多个小demo的高兴,即使自个儿对小程序还尚未做过无数实施,只是在合法例子上犹豫,不过依旧想做出点小东西。既然要做二个demo,自然要求到数量,本身有又不想单独搭建服务端,所以在英特网寻找能够用来提供测验数据的免费api,最终笔者选取了豆瓣图书。豆瓣图书提供的api功效比较少,加上不开放appkey申请,所以不大概操功用户数据。只好做点轻易的图书查询和本本详细新闻展现,这一个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"
}
var api = require('./api.js');
var utils = require('../utils/util.js');

/**
 * 网路请求
 */
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);
}

/**
 * 获取图书详细信息
 */
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
}

上拉加载的功力是三个小球不停的更动颜色,需求多少个颜色列表

api.js

最终效果图

<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>没有找到相关图书</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">图书标图</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>
/**
 * 刷新上拉加载效果变色球
 */
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 );
}
//刷新动态球颜色
var iconColor = [
 '#353535', '#888888'
];

util.js

onLoad: function( option ) {
  this.setData({
   id: option.id
  });
}
参数 意义
:id 图书id

index.wxml

图片 3

示范代码

requestData中封装了必要图书列表的法子

下一场用一个计时器来动态改造小球Logo的颜色

搞活了首页和详细页的静态页面,接下去就是通过互联网央浼api来获取数据,并呈现到页面上来。

参数 意义 备注
q 查询关键字 q和tag必传其一
tag 查询的tag q和tag必传其一
start 取结果的offset 默认为0
count 取结果的条数 默认为20,最大为100

首页

/**
 * 请求图书信息
 */
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 });
 });
}
DouBanBookApp
  pages
    index 首页
      index.js
      index.wxml
      index.wxss
    detail 详情页
      detail.js
      detail.wxml
      detail.wxss
  requests 
    api.js API地址
    request.js 网络请求
  utils
    util.js 工具
  app.js
  app.json
  app.wxss
<view>
  <view class="cover-container">
    <image src="images/demo.png"></image>
  </view>

  <view class="book-meta">
    <view class="meta-info">
      <text class="book-title">图书标题</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>

源码地址:demo下载

骨子里小程序的页面制作跟经常的html和css大概,只是页面中无法用古板的html标签,而是改用了小程序提供的自定义标签,小程序对css的帮助也是有限制,注意如何写法不相配也大都懂了。操作页面变化是由此数据变动来显示出来的,那一点有一点点像react和vue。以上的demo用到的知识点并寥寥无几,首若是页面包车型地铁数额绑定、事件绑定、模版知识和互联网央求等有关api。稳重看看文档也基本上能够做出一个小例子。

近些日子微信小程序被炒得比相当红爆,本身也抱着试一试的姿态下载了微信web开拓者工具,开采工具相比较精简,功能绝比较较少,性情化设置也未有。精晓完开荒工具之后,顺便看了弹指间小程序的合法开荒文书档案,大约明白了小程序的付出流程和部分常用的API。

//跳转到详细页面
toDetailPage: function( e ) {
  var bid = e.currentTarget.dataset.bid; //图书id [data-bid]
  wx.navigateTo( {
   url: '../detail/detail?id=' + bid
  });
}

上述就是本文的全体内容,希望对大家的学习抱有支持,也目的在于大家多多帮衬脚本之家。

以下是现实性图书的详细情形消息,部分demo中用不到的音讯省略

当点击找出按键是,触发tap事件,其绑定了searchClickEvent

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;
}

应用的主调色参照他事他说加以考察了豆瓣app的色调,选用了偏草地绿。

searchClickEvent: function( e ) {
  if( !this.data.searchKey )
   return;
  this.setData( { pageIndex: 0, pageData: [] });
  requestData.call( this );
}

互连网央求和数据管理

index.wxss

稍稍常常采纳的工具函数放到了util.js中

首页有图书找寻和列表展示,上拉加载的职能。微信小程序中未有了DOM操作的定义,一切的分界面成分的改造都要由此数据变化来退换,所以要求在js中的Page中的data中注脚十分的大多据分子。

书本详细页面正是体现具体的图书信息,通用首页穿过了的书籍id来得到图书音讯之后在显示出来,获取的进度中可能有延期,需求贰个加载效果来衔接。

Demo编写

detail.js中收受参数

获得图书详细情况

request.js

demo中用到的豆类图书api唯有五个,二个是书籍搜索,另一个是得到图书详细的情况。

首页顶端显示搜索输入框,用户输入图书名称,点击寻觅按键,显示图书列表。图书大概会过多,无法弹指间全方位显得,供给用到分页,app上最普及的列表分页就是上拉加载情势,依照小程序提供的机件中,找到了二个比较吻合场景的scroll-view组件,那些组件有一个上拉到尾巴部分自动触发的bindscrolltolower事件。

创造项目

GET https://api.douban.com/v2/book/search

用户在输入数据时,输入框的input绑定了searchInput伊芙nt事件,就回捕获到输入的多寡,把输入的数据更新的data中的searchKey中。

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图