1.項目結構
2.list 列表頁
(1)數據(邏輯)
list.js
// pages/list/list.js Page({ /** * 頁面的初始數據 */ data: { title: '加載中...', // 狀態 list: [], // 數據列表 type: '', // 數據類型 loading: true // 顯示等待框 }, /** * 生命周期函數--監聽頁面加載 */ onLoad: function (options) { // options 為 board頁傳來的參數 const _this = this; // 拼接請求url const url = 'https://api.douban.com/v2/movie/' + options.type; // 請求數據 wx.request({ url: url, data: {}, header: { 'content-type': 'json' // 默認值 }, success: function(res) { console.log(res.data); // 賦值 _this.setData({ title: res.data.title, list: res.data.subjects, type: options.type, loading: false // 關閉等待框 }) } }) } })
(2)頁面布局
list.wxml
<!--pages/list/list.wxml--> <!--列表頁--> <view class='container'> <!--等待框--> <loading hidden="{{!loading}}">加載中...</loading> <!--頂部標題欄--> <view class='page-header'> <text class='page-title'>{{title}}</text> </view> <!--列表--> <view class='page-body' wx:for="{{list}}" wx:key="id"> <!--類型判斷,顯示不同的數據--> <block wx:if="{{type === 'us_box'}}"> <navigator url='../item/item?id={{item.subject.id}}'> <view class='item'> <image class='poster' src='{{item.subject.images.small}}'></image> <view class='meta'> <text class='title'>{{item.subject.title}}</text> <text class='sub-title'>{{item.subject.original_title}}({{item.subject.year}})</text> <view class='artists'> <text>導演:</text> <text wx:for="{{item.subject.directors}}" wx:key="id">{{item.name}}</text> </view> <view class='rating'> <text>{{item.subject.rating.average}}</text> </view> </view> </view> </navigator> </block> <!--另一種情況--> <block wx:else> <navigator url='../item/item?id={{ item.id }}'> <view class='item'> <image class='poster' src='{{item.images.small}}'></image> <view class='meta'> <text class='title'>{{item.title}}</text> <text class='sub-title'>{{item.original_title}}({{item.year}})</text> <view class='artists'> <text>導演:</text> <text wx:for="{{item.directors}}" wx:key="id">{{item.name}}</text> </view> <view class='rating'> <text>{{item.rating.average}}</text> </view> </view> </view> </navigator> </block> </view> </view>
(3)樣式
list.wxss
/* pages/list/list.wxss */ .page-header { display: flex; justify-content: center; border-bottom: 1rpx solid #ccc; } .page-title { padding: 20rpx 40rpx; color: #999; font-size: 38rpx; text-align: center; } .page-body { display: flex; flex: 1; flex-direction: column; } .item { display: flex; padding: 20rpx 40rpx; border-bottom: 1rpx solid #eee; cursor: pointer; } .item .poster { width: 128rpx; height: 128rpx; margin-right: 20rpx; } .item .meta { flex: 1; } .item .meta .title,.item .meta .sub-title { display: block; margin-bottom: 15rpx; } .item .meta .title { font-size: 32rpx; } .item .meta .sub-title { font-size: 22rpx; color: #c0c0c0; } .item .meta .artists { font-size: 26rpx; color: #999; } .item .rating { font-size: 28rpx; font-weight: bold; color: #f74c31; } .tips { font-size: 28rpx; text-align: center; padding: 50rpx; color: #ccc; } .tips image { width: 40rpx; height: 40rpx; margin-right: 20rpx; } .tips image,.tips text { vertical-align: middle; }
(4)效果圖
3.item 詳情頁
(1)數據(邏輯)
item.js
// pages/item/item.js Page({ /** * 頁面的初始數據 */ data: { title: '', loading: true, movie: {} }, /** * 生命周期函數--監聽頁面加載 */ onLoad: function (options) { const _this = this; // 拼接請求url const url = 'https://api.douban.com/v2/movie/subject/' + options.id; // 請求數據 wx.request({ url: url, data: {}, header: { 'content-type': 'json' // 默認值 }, success:function(res) { // 賦值 _this.setData({ movie: res.data, loading: false // 隱藏等待框 }) } }) }, /** * 生命周期函數--監聽頁面初次渲染完成 */ onReady: function () { // 修改導航欄標題 wx.setNavigationBarTitle({ title: this.data.title + '<<電影<<豆瓣' }) } })
(2)頁面布局
item.wxml
<!--pages/item/item.wxml--> <!--詳情頁--> <!--等待框--> <loading hidden="{{!loading}}">加載中...</loading> <!--滾動列表--> <scroll-view scroll-y="true" wx:if="{{movie.title}}"> <view class='meta'> <image class='poster' src='{{movie.images.large}}' background-size="cover"></image> <text class='title'>{{movie.title}}({{movie.year}})</text> <text class='info'>評分:{{movie.rating.average}}</text> <text class='info'>導演:<block wx:for="{{movie.directors}}" wx:key="id">{{item.name}}</block></text> <text class='info'>主演:<block wx:for="{{movie.casts}}" wx:key="id">{{item.name}}</block></text> </view> <view class='summary'> <text class='label'>摘要:</text> <text class='content'>{{movie.summary}}</text> </view> </scroll-view>
(3)樣式
item.wxss
/* pages/item/item.wxss */ .meta { display: flex; flex-direction: column; align-items: center; height: 1000rpx; padding: 50rpx 40rpx; } .poster { width: 80%; height: 80%; margin: 20rpx; } .title { font-size: 42rpx; color: #444; } .info { font-size: 18rpx; color: #888; margin-top: 20rpx; width: 80%; } .summary { width: 80%; margin: 30rpx auto; } .label { display: block; } .content { color: #666; font-size: 20rpx; padding: 10rpx; }
(4)效果圖