demo截图:

图书:

    

电影:

      

共工欲善其事,必先利其器:

小程序编辑器下载地址 : https://mp.weixin.qq.com/debug/wxadoc/dev/devtools/download.html?t=1477656486010

小程序API : https://mp.weixin.qq.com/debug/wxadoc/dev/framework/structure.html?t=20161102

项目文件:

image: 为图片文件夹(用的微信组建里的图片);

pages: 页面:

utils: 模块化js;

app.js:全局启动js(这个demo没有用到);

app.wxss:全局加载css样式;

app.json 初始化的配置文件:

 {
"pages":[ //页面路径
"pages/book/book", //第一个路径默认为首页
"pages/bookInfo/bookInfo",
"pages/movie/movie",
"pages/movieInfo/movieInfo"
],
"window":{ //默认也米娜的窗口表现
"backgroundTextStyle" : "black", //下拉背景字体
"navigationBarBackgroundColor": "#edf4ed", //导航栏背景颜色
"navigationBarTitleText": "WeChat", //导航栏标题文字内容
"navigationBarTextStyle": "#06bd04", //导航栏标题颜色,仅支持 black/white
"backgroundColor" : "#fff", //窗口的背景色
"enablePullDownRefresh" : false //是否开启下拉刷新
},
"tabBar": { //底部 tab
"list": [{ //tab 的列表,详见 list 属性说明,最少2个、最多5个 tab
"pagePath": "pages/book/book", //页面路径,必须在 pages 中先定义
"iconPath": "image/icon_component.png", //图片路径,icon 大小限制为40kb
"selectedIconPath": "image/icon_component_HL.png", //选中时的图片路径,icon 大小限制为40kb
"text": "热门图书" //tab 上按钮文字
},
{
"pagePath": "pages/movie/movie",
"iconPath": "image/icon_API.png",
"selectedIconPath": "image/icon_API_HL.png",
"text": "热门电影"
}],
"color" : "#000", //tab 上的文字默认颜色
"borderStyle" : "white", //tabbar上边框的颜色, 仅支持 black/white
"backgroundColor" : "#edf4ed", //tab 的背景色
"selectedColor": "#06bd04", //tab 上的文字选中时的颜色
"position" : "bottom" //可选值 bottom、top
},
"networkTimeout": { //设置网络超时时间
"request": 10000, //wx.request的超时时间,单位毫秒
"connectSocket": 10000, //wx.connectSocket的超时时间,单位毫秒
"uploadFile": 10000, //wx.uploadFile的超时时间,单位毫秒
"downloadFile": 10000 //wx.downloadFile的超时时间,单位毫秒
},
"debug": true //设置是否开启 debug 模式
}

wxss == css

  新单位:

    rpx : 规定屏幕宽为750rpx。如在 iPhone6 上,屏幕宽度为375px,共有750个物理像素,则750rpx = 375px = 750物理像素,1rpx = 0.5px = 1物理像素。

        其实小程序会最后会把rpx自己转换成rem;

    样式加载:

      1.样式导入 /** app.wxss **/ @import "common.wxss";
      2.内联样式 <view style="color:{{color}};" />

    注:1、app.wxss 为整站加载的全局样式、个pages页里的样式都是独立的; 2、css3 选择器支持的不够全,不支持nth-child(n);

wxhtml == html

      这个wxhtml 自己做一套标签而且混了组件,js事件于一起;

js

js模块化:exports 是 module.exports 的一个引用,因此在模块里边随意更改 exports 的指向会造成未知的错误。所以我们更推荐开发者采用module.exports 来暴露模块接口,除非你已经清晰知道这两者的关系。在需要使用这些模块的文件中,使用 require(path) 将公共代码引入;

我豆瓣的book的结构:

pages 目录结构:

设置的页面

book          : 豆瓣图书首页;

bookInfo    : 读书的详情页;

movie        : 豆瓣电影页;

movieInfo   : 电影的详情页;

以读书首页为例:

目录

制作的wxhml页面名必须和目录名一致,而且必须要有同命的JS;

book.wxml:

<!--book.wxml-->
<view class="container" >
<view class="book-main">
<scroll-view class="scroll-view_H" scroll-x="true" style="height:{{h}}px" scroll-y="true" bindscrolltolower="scrollBottom" bindscroll="scroll">
<view class="book-warp">
<view wx:key="{{}}" wx:for="{{book}}" wx:for-index="idx" wx:for-key="item" >
<view class="book-list" data-index="{{index}}" data-id="{{item.id}}" >
<!--bindtap="bindViewTap"-->
<view class="book-pic">
<image style="width:136rpx;height:96px" src="{{item.images.small}}"></image>
</view>
<navigator class="book-name" url="../bookInfo/bookInfo?id={{item.id}}">{{item.title}}</navigator>
</view>
</view >
</view>
<view hidden="{{hidden2}}" class="no-data">没有数据喽~</view>
</scroll-view>
</view>
</view>

book.js:

//book.js
Page({
data: {
hidden2:true, //判断是否没有数据加载;
total : 0, //总数;
page :20, //加载到第几条数据;
h:0, //滚动高度;
book: [] //数据;
},
onShow: function( e ) {
//设置滚动加载高度;
var that = this;
wx.getSystemInfo({
success : function(res){
that.setData( {
h:res.windowHeight
})
}
}); },
onLoad: function () {
var that = this;
//页面加载请求json数据;
wx.request({
url: 'https://api.douban.com/v2/book/search?tag=热门&start=0&fields=id,title,author,images,url',
header: {
'Content-Type': 'application/json'
},
success: function(res) {
that.setData({
book :res.data.books,
total : res.data.total
});
}
});
},
scrollBottom:function() {
var page = this.data.page + 20;
var that = this;
wx.showToast({
title: '加载中',
icon: 'loading'
});
//判断是否加载还需要加载;
if( this.data.total >= page ){
this.setData({
hidden: false
});
wx.request({
url: 'https://api.douban.com/v2/book/search?tag=top250&start='+ page +'&fields=id,title,author,images,url',
header: {
'Content-Type': 'application/json'
},
success: function(res) {
that.setData({
book:that.data.book.concat(res.data.books),
page:that.data.page+21,
hidden: true
});
wx.hideToast();
console.log(that.data.page);
}
});
}else{
that.setData({
hidden2: false
}); } }
})

 book.wxss

.book-main{
width:100%;
padding:20rpx 0;
height:100%;
box-sizing: border-box;
}
.book-warp{
width:100%;
clear:both;
overflow:hidden;
}
.book-list{
display:inline-block;
float:left;
width:230rpx;
text-align: center;
margin-right: 10rpx;
margin-bottom: 10rpx;
}
.book-name{
display:block;
height:100rpx;
line-height:100rpx;
overflow: hidden;
font-size:40rpx;
}
.no-data{
text-align: center;
}

book.json:

{
"navigationBarTitleText": "豆瓣读书" //设置导航栏的文字内容;
}

bookInfo读书详情页:

bookInfo.wxml:

<!-- 详情.wxml-->
<view class="container">
<view data-id="{{info.id}}" bindtap="bindViewTap">
<view class="info-pic">
<image style="width:306px;height:432px" src="{{info.images.large}}"></image>
</view>
<view class="info-pada">
<text class="info-name">{{info.title}}</text>
<view class="info-list">
<view>
<text>作者:{{info.author[0]}}</text>
</view>
<view>
<text>出版社:{{info.publisher}}</text>
</view>
<view>
<text>出版时间:{{info.pubdate}}</text>
</view>
<view>
<text>价格:{{info.price}}</text>
</view>
</view>
<view class="info-Intr">
<view class="info-title">简介</view>
<text class="info-txt">{{info.author_intro}}</text>
</view>
</view>
</view>
</view>

bookInfo.wxss:

.info-pada{
padding:10rpx 20rpx;
}
.info-pic{
text-align: center;
}
.info-name{
font-size: 54rpx;
margin:10rpx;
}
.info-list{
font-size: 30rpx;
color:#ccc;
line-hegiht:50rpx;
}
.info-Intr{
border-top:2rpx solid #ccc;
margin:20rpx 0;
}
.info-title{
padding-top:30rpx;
font-size:30rpx;
color:#ccc;
line-hegiht:50rpx;
}
.info-txt{
font-size:30rpx;
line-hegiht:86rpx;
}

bookInfo.js:

 //book.js
Page({
data: {
id : null, //图书id;
info: {} //图书详情;
},
onLoad: function ( option ) {
//页面加载时获取传过来的的id;
this.setData({
id: option.id
});
var id = this.data.id;
var _this = this;
var c = 'https://api.douban.com/v2/book/'+id;
//向豆瓣请求
wx.request({
url: c,
method: 'GET',
header: {
'Content-Type': 'application/json'
},
success: function(res) {
_this.setData({
info:res.data
});
//设置导航条的图书名称;
wx.setNavigationBarTitle({
title: res.data.title
});
}
})
}
})

bookInfo.json:

{
"navigationBarTitleText": "豆瓣读书" //其实没啥用
}

 电影其实和这个基本一样只不过css样式和豆瓣API返回的json名稍有不同; 

豆瓣:

    读书API : https://developers.douban.com/wiki/?title=book_v2

    电影API : https://developers.douban.com/wiki/?title=movie_v2

我遇到的小程序问题:

  1.API未定型;

  2.没有a标签的链接(不算是问题);

  3.css3样式支持的不全;

  4.不能引用正常的css样式文件;

  5.没有DOM操作,所以不能用zepto/jquery(不算是问题);

后记:

  特别尴尬的开发完这个小demo完了没多久就版本更新了,像之前loading的改成纯js调方法了,还有用到上个版本的编辑器简直了。

   向对我这中单蠢的切切图仔的难点来自 http的请求、请求排错、操作数据、业务处理 这都是我不层涉猎的,这是要让我失业的节奏。

微信小程序-制作简易豆瓣笔记的更多相关文章

  1. 微信小程序开发:学习笔记[7]——理解小程序的宿主环境

    微信小程序开发:学习笔记[7]——理解小程序的宿主环境 渲染层与逻辑层 小程序的运行环境分成渲染层和逻辑层. 程序构造器

  2. 微信小程序开发:学习笔记[5]——JavaScript脚本

    微信小程序开发:学习笔记[5]——JavaScript脚本 快速开始 介绍 小程序的主要开发语言是 JavaScript ,开发者使用 JavaScript 来开发业务逻辑以及调用小程序的 API 来 ...

  3. 微信小程序开发:学习笔记[4]——样式布局

    微信小程序开发:学习笔记[4]——样式布局 Flex布局 新的布局方式 在小程序开发中,我们需要考虑各种尺寸终端设备上的适配.在传统网页开发,我们用的是盒模型,通过display:inline | b ...

  4. 微信小程序开发:学习笔记[3]——WXSS样式

    微信小程序开发:学习笔记[3]——WXSS样式 快速开始 介绍 WXSS(WeiXin Style Sheets)是一套用于小程序的样式语言,用于描述WXML的组件样式,也就是视觉上的效果. WXSS ...

  5. 微信小程序开发:学习笔记[2]——WXML模板

    微信小程序开发:学习笔记[2]——WXML模板 快速开始 介绍 WXML 全称是 WeiXin Markup Language,是小程序框架设计的一套标签语言,结合小程序的基础组件.事件系统,可以构建 ...

  6. 微信小程序开发:学习笔记[1]——Hello World

    微信小程序开发:学习笔记[1]——Hello World 快速开始 1.前往微信公众平台下载微信开发者工具. 地址:https://mp.weixin.qq.com/debug/wxadoc/dev/ ...

  7. 微信小程序开发:学习笔记[9]——本地数据缓存

    微信小程序开发:学习笔记[9]——本地数据缓存 快速开始 说明 本地数据缓存是小程序存储在当前设备上硬盘上的数据,本地数据缓存有非常多的用途,我们可以利用本地数据缓存来存储用户在小程序上产生的操作,在 ...

  8. 微信小程序开发:学习笔记[8]——页面跳转及传参

    微信小程序开发:学习笔记[8]——页面跳转及传参 页面跳转 一个小程序拥有多个页面,我们可以通过wx.navigateTo推入一个新的页面.在首页使用2次wx.navigateTo后,页面层级会有三层 ...

  9. 微信小程序实例--仿豆瓣电影

    最近不想写论文,就想捣鼓点新东西吧,就边看官方文档,花了3天时间写了一个简单的仿豆瓣电影的微信小程序,给大家分享一下教程吧. 源码&效果图 源码点击这里,欢迎star 运行方法: 下载微信we ...

随机推荐

  1. 服务网关Ocelot 入门Demo系列(01-Ocelot极简单Demo及负载均衡的配置)

    [前言] Ocelot是一个用.NET Core实现并且开源的API网关,它功能强大,包括了:路由.请求聚合.服务发现.认证.鉴权.限流熔断.并内置了负载均衡器与Service Fabric.Butt ...

  2. 全局css控制<td>标签属性

    td { text-align: center; /*设置水平居中*/ vertical-align: middle; /*设置垂直居中*/    height:50px;             / ...

  3. Sql Server登录失败问题

    1.启动SQL Server 2008 Management Studio,会看到 2. 里面有一个 身份验证.这个 身份验证 的下拉列表里面有两个选项: Windows 身份验证 和 SQL Ser ...

  4. Player启动时提示 "System.InvalidOperationException:无法加载计数器名称数据

    问题 播放器意外断电重启后可能导致Player启动时报错,提示如下: 原因 这个提示一般指 Universal Player 找不到或无法设置一个Windows Performance Monitor ...

  5. CodeForces Round #553 Div2

    A. Maxim and Biology 代码: #include <bits/stdc++.h> using namespace std; int N; string s; int mi ...

  6. ASUS RT-AC68U 刷梅林固件及安装***插件记录(详细)

    本文借鉴网络并亲自刷机过程记录(网上很多教程都不太详细) 版本:华硕ASUS RT- AC68U    Wireless-AC1900 路由器的连接方式略,有说明书 连好后打开浏览器输入:http:/ ...

  7. Delphi Create(nil), Create(self), Create(Application)的区别

    最近的项目中经常在程序中动态创建控件,势必用到Create. 但是随之而来的问题就是动态创建的控件是否可以正确的释放内存? 以及 Create(nil), Create(self), Create(A ...

  8. GC Tools

    GC Tools There are multiple ways to enable the GC log: specifying either of the flags -verbose:gc or ...

  9. vue 自定义指令的使用案例

    参考资料: 1. vue 自定义指令: 2. vue 自定义指令实现 v-loading: v-loading,是 element-ui 组件库中的一个用于数据加载过程中的过渡动画指令,项目中也很少需 ...

  10. mpvue——动态渲染echarts图表

    前言 使用mpvue-echarts来写图表,那个F2再提醒自己下要踩坑不能忘记.遇到了一个问题就是数据不能动态的去渲染,这个其实官方给了我们对应的方法 懒加载 代码 修改了调用initChart() ...