首先感謝cnode社區提供的api,本次實現了簡單的cnode社區應用號製做。 實現了數據的讀取、展現, 實現了簡單的佈局, 實現了下一頁功能。 html
下面就說說我作這個的過程,不足之處,請多多指教,只願爲進步。node
首先,在官網下載工具,下載地址 個人是選擇mac版本0.9.092300。react
而後跟着官方的簡版教程 建立一個項目。jquery
默認的項目裏已經沒有關於tabBar的配置信息,因此爲了學習,我把這個配置進行了修改。git
首先關於配置的說明一樣來自於官方github
注意:官方的代碼有些字段是不同的,當心被坑。web
{ "pages":[ "pages/index/index", "pages/logs/logs" ], "window":{ "backgroundTextStyle":"light", "navigationBarBackgroundColor": "#fff", "navigationBarTitleText": "WeChat", "navigationBarTextStyle":"black" }, "tabBar":{ "list": [{ "pagePath": "pages/index/index", "text": "首頁" }, { "pagePath": "pages/logs/logs", "text": "日誌" }] } }
增長了tabBar, 查看調試 看界面是如此的簡陋,爲此針對tabBar參考官方說明進行了簡單的美化。小程序
"tabBar":{ "color":"#272636", "selectedColor":"#80bd01", "backgroundColor":"#fff", "borderStyle":"white", "list":[{ "pagePath":"pages/index/index", "text":"首頁", "iconPath":"images/tabBar/my.png", "selectedIconPath":"images/tabBar/my_hl.png" },{ "pagePath":"pages/index/index", "text":"個人", "iconPath":"images/tabBar/list.png", "selectedIconPath":"images/tabBar/list_hl.png" }] }
效果如圖 最後根據文檔,對默認頁面的窗口表現進行了修改api
"window":{ "backgroundTextStyle":"black", "backgroundColor":"#fff", "navigationBarBackgroundColor":"#000", "navigationBarTitleText":"CNODE 應用號版", "navigationBarTextStyle":"white", "enablePullDownRefresh":"true" },
效果如圖 總體配置文件爲數組
{ "pages":[ "pages/index/index", "pages/logs/logs" ], "window":{ "backgroundTextStyle":"black", "backgroundColor":"#fff", "navigationBarBackgroundColor":"#000", "navigationBarTitleText":"CNODE 應用號版", "navigationBarTextStyle":"white", "enablePullDownRefresh":"true" }, "tabBar":{ "color":"#272636", "selectedColor":"#80bd01", "backgroundColor":"#fff", "borderStyle":"white", "list":[{ "pagePath":"pages/index/index", "text":"首頁", "iconPath":"images/tabBar/my.png", "selectedIconPath":"images/tabBar/my_hl.png" },{ "pagePath":"pages/index/index", "text":"個人", "iconPath":"images/tabBar/list.png", "selectedIconPath":"images/tabBar/list_hl.png" }] } }
根據官方要求,我在pages文件夾內建立了topics文件夾,並建立了對應了 topics.js、topics.wxml、topics.wxss 三個文件。
首先在配置文件裏註冊這個topics,
"pages":[ "pages/topics/topics", "pages/index/index", "pages/logs/logs" ],
而且制定tabBar點擊跳到對應的topics頁面
"tabBar":{ "color":"#272636", "selectedColor":"#80bd01", "backgroundColor":"#fff", "borderStyle":"white", "list":[{ "pagePath":"pages/topics/topics", "text":"首頁", "iconPath":"images/tabBar/my.png", "selectedIconPath":"images/tabBar/my_hl.png" },{ "pagePath":"pages/index/index", "text":"個人", "iconPath":"images/tabBar/list.png", "selectedIconPath":"images/tabBar/list_hl.png" }] }
"pages/topics/topics"
放到了"pages/index/index"
的前面而後編寫topics.js
Page({ data: { title: '首頁列表' }, onLoad: function () { console.log('onLoad by topics'); } });
以及topics.wxml文件
<view class="topics-main"> 測試首頁列表界面 </view>
和topics.wxss文件
.topics-main { background: #f60; height: 100%; }
最後效果如圖
根據文檔請求數據,在util文件夾內建立一個api.js文件,專門進行數據請求處理。
'use strict'; var HOST_URI = 'https://cnodejs.org/api/v1'; var GET_TOPICS = '/topics'; var GET_TOPIC_BY_ID = '/topic/'; function obj2uri (obj) { return Object.keys(obj).map(function (k) { return encodeURIComponent(k) + '=' + encodeURIComponent(obj[k]); }).join('&'); } module.exports = { // 獲取列表數據 getTopics: function (obj) { return HOST_URI + GET_TOPICS + '?' + obj2uri(obj); }, // 獲取內容頁數據 getTopicByID: function (id, obj) { return HOST_URI + GET_TOPIC_BY_ID + id + '?' + obj2uri(obj); } };
修改topics.js
var Api = require('../../utils/api.js'); Page({ data: { title: '首頁列表' }, onLoad: function () { console.log('onLoad by topics'); this.fetchData();// 獲取數據 }, fetchData: function (data) { // 處理參數 if (!data) data = {}; if (!data.page) data.page = 1; wx.request({ url: Api.getTopics(data), success: function (res) { console.log(res); } }); } });
效果如圖 成功拿到了數據。
拿到了數據,也能修改界面,那麼就直接完善這個首頁吧
代碼就不放了,直接上圖 我認爲這裏值得說的大概只有loading、循環、傳參、下一頁和頁面跳轉了。
<loading hidden="{{hidden}}"> 加載中... </loading>
在topics.wxml中寫官方提供的loading組件,根據在topics.js中對hidden值的修改,來觸發loading。
文檔提供了列表渲染
經過wx:for
實現列表的渲染。
<block wx:for="{{postsList}}"> <view class="posts-item" index="{{index}}" id="{{item.id}}" catchtap="redictDetail"> <view class="author"> <image class="author-avatar" src="{{item.author.avatar_url}}"></image> <view class="author-name">{{item.author.loginname}}</view> <view class="posts-tag hot" wx:if="{{item.top === true}}">置頂</view> <view class="posts-tag" wx:if="{{item.good === true}}">精華</view> <view class="posts-last-reply">{{item.last_reply_at}}</view> </view> <view class="posts-title">{{item.title}}</view> <view class="bar-info"> <view class="bar-info-item"> <image class="bar-info-item-icon" src="/images/icon/reply.png"></image> <view class="bar-info-item-number">{{item.reply_count}}</view> </view> <view class="bar-info-item"> <image class="bar-info-item-icon" src="/images/icon/visit.png"></image> <view class="bar-info-item-number">{{item.visit_count}}</view> </view> </view> </view> </block>
附上一個沒有樣式的列表展示
根據cnode的api能夠知道經過tab不一樣的值,得到到不一樣標籤下的內容列表。
因此 在頁面的最上面 tab 欄中
<view class="top-bar"> <view class="top-bar-item" id="all" catchtap="onTapTag">所有</view> <view class="top-bar-item" id="good" catchtap="onTapTag">精華</view> <view class="top-bar-item" id="share" catchtap="onTapTag">分享</view> <view class="top-bar-item" id="ask" catchtap="onTapTag">問答</view> <view class="top-bar-item" id="job" catchtap="onTapTag">招聘</view> </view>
將id進行定義,經過獲取id拿到對應的tab類型。
其中catchtap
是事件綁定。
bind事件綁定不會阻止冒泡事件向上冒泡,catch事件綁定能夠阻止冒泡事件向上冒泡。
在topics.js獲取
onTapTag: function (e) { var self = this; var tab = e.currentTarget.id; // 這裏就能獲取到不一樣的tab值了 self.setData({ tab: tab }); if (tab !== 'all') { this.fetchData({tab: tab}); } else { this.fetchData(); } },
根據文檔,組件的視圖容器中有scroll-view這個可滾動視圖區域。
<scroll-view class="posts-list" style="height:100%" scroll-y="true" bindscrolltolower="lower"> <block wx:for="{{postsList}}"> ... </block> </scroll-view>
topics.js文件
lower: function (e) { var self = this; // 修改當前頁碼 self.setData({ page: self.data.page + 1 }); // 判斷當前頁的tab值 進行請求數據 if (self.data.tab !== 'all') { this.fetchData({tab: self.data.tab, page: self.data.page}); } else { this.fetchData({page: self.data.page}); } }
在posts-item
中已經進行了事件綁定。利用wx.navigateTo
實現頁面的跳轉。
redictDetail: function (e) { console.log('我要看詳情'); var id = e.currentTarget.id, url = '../detail/detail?id=' + id; // 這裏的detail是須要建立對應的文件,以及頁面註冊的 wx.navigateTo({ url: url }) },
一樣的原理,建立detail文件,並註冊,獲取數據,並美化頁面。
放上個人github地址 https://github.com/coolfishstudio/wechat-webapp-cnode
最後感謝:cnode社區和博卡君
附上 博卡君的教程