根據妙味課堂上的一個教程練習總結,供本身複習用css
1、功能介紹html
一個網易新聞客戶端的瀏覽頁面,經過網易新聞的api接口實時獲取新聞數據,用vux搭建樣式框架,以輪播圖,文字滾動,圖文列表等形式把內容展現出來,可實現下拉刷新,上滑加載,文本提示更新,導航跳轉到其餘頁面等功能。vue
2、涉及技術node
基礎:Html,css,Javascript,響應式,es6,vue-router,vue-jsonpwebpack
其餘:nodejs,npm,vue,webpack,git,vuxgit
3、模塊劃分es6
a,輪播圖,圖片+標題的形式無縫輪播滾動新聞,點擊可跳轉至網易的新聞界面github
b.文字條切換,文字以上下滑動形式切換web
c.新聞列表展現,左圖右標題形式,點擊可跳轉至網易新聞詳情頁界面vue-router
d.底部導航,可導航至其餘組件(音樂,電影,閱讀)頁面,在每一個界面始終顯示
e.其餘:回到頂部,回到首頁等
4、搭建過程
1.新建項目(已安裝好node,vue-cli等)
執行vue init webpack 1633,新建一個名叫1633的項目,新建好後進入項目,執行npm i安裝相關依賴,而後執行 npm run dev,默認8080端口,若是端口被佔用,在config/index.js裏改下端口,重啓服務器,在瀏覽器中輸入localhost:端口號,能彈出vue的歡迎界面,及安裝成功。
2.安裝vux組件庫
執行npm i -s vux ,安裝好後能夠在package.json 中看到響應的版本信息,因爲以後會用到vux 的viewBox,xHeader等組件,這裏咱們提早安裝好相關的依賴
const vuxLoader=require('vux-loader')
baseWebpackConfig=vuxLoader.merge(baseWebpackConfig,{plugins:['vux-ui']})
(要設置語言包 vuex-i18n,若是不引入,會提示_vm.$t is not a function報錯,另,引入了發佈到服務器依然會報這個錯誤。。)
到此,前期的設置基本完成。
3.搭建界面
組件的引入 ,在import { 組件名 } from 'vux',而後再conponents中註冊該組件名,就能夠使用了,組件使用的時候以小寫加鏈接符的形式,如viewBox,使用時爲 <view-box> </view-box>
咱們分別引入如下組件:
組件引入完畢,先根據官方文檔查看相應的設置,數據先填充案例裏的,總體界面能正常運行便可。
4.數據加載
a) 數據來源準備:
b) vue jsonp 解決跨域處理:
c) 數據處理
首頁一進入就獲取數據,這個須要把加載數據的函數設置在vue的created生命週期函數中
created () {
this.$jsonp('http://3g.163.com/touch/jsonp/sy/recommend/0-9.html').then(data => {
/* 這裏是獲取的數據 */
console.log(data)
// 處理輪播的數據
this.swiperList = data.live.filter(item => {
return item.addata === null && item.picInfo[0]; //這裏item.picInfo[0]必須保證有圖片,不然顯示不出來
}).map(item => {
return {
url: item.link,
img: item.picInfo[0].url,
title: item.title
}
})
// 處理跑馬燈數據
this.marqueeList = data.focus.filter(item => {
return item.addata === null
}).map(item => {
return {
title: item.title
}
})
// 處理文章列表數據
this.panelList = data.list.filter(item => {
return item.addata === null && item.picInfo[0] && item.digest
}).map(item => {
return {
src: item.picInfo[0].url,
title: item.title,
desc: item.digest,
url: '/detailPage'
}
})
})
}
第一個參數是咱們的請求地址它返回給咱們的是一個promise對象,能夠經過then方法進行調用並return出想要的結果數據,then的參數data即咱們拿到的原始數據,經過數組的filter方法篩選出想要的數據,map循環遍歷每一項數據,按照須要的類型統一返回出去,再賦值給swiperList和其餘的項,swiperList,MarqueeList,PanelList要提早在data()裏面定義好,內容爲空數組。
d) 渲染數據到界面中
把以前的測試數據刪除,綁定上新的數據
<swiper :list="swiperList" :loop="true"></swiper>
<marquee class="my-marquee">
<marquee-item v-for="i in marqueeList" :key='i'>{{i.title}}</marquee-item>
</marquee>
<panel :list="panelList" class="panel-list" :type="type"></panel>
到此,數據填充完畢
e)下拉上滑刷新處理
引入下拉刷新及無限加載組件,執行npm i vue-scroller -S ,安裝好後把要刷新的內容包裹進來便可。
<scroller class="my-scroller" :on-refresh="refresh" refreshText="等我一下~" :on-infinite="infinite" ref="myRef">
<swiper :list="swiperList" :loop="true"></swiper>
<marquee class="my-marquee">
<marquee-item v-for="i in marqueeList" :key='i'>{{i.title}}</marquee-item>
</marquee>
<panel :list="panelList" class="panel-list" :type="type"></panel>
</scroller>
下拉刷新:on-refresh="refresh"
refresh () {
getFreshKey()
this.$jsonp(`http://3g.163.com/touch/jsonp/sy/recommend/${start}-${end}.html`, {
miss: '00',
refresh: keyValue
}).then(data => {
/* console.log(this.$refs.myRef) 這個方法就像是jq裏經過dom獲取元素同樣,只不過咱們要減小dom的操做 */
/* 這裏是獲取的數據 */
// console.log(data)
// 處理文章列表數據
(省略同上)
this.$refs.myRef.finishPullToRefresh()//中止下拉刷新
this.$vux.toast.text(`本次共刷新了${this.panelList.length}條數據`)//文本提示刷新了多少條數據
}
這裏聲明瞭一個getFreshKey函數,每次刷新的時候執行,初始值爲0,每刷新一次加1,動態拿到refreshKey中的每一項,賦值給refresh,保證每次刷新
拿到的數據都不同。
let start = 0;
let end = start + 9;
let refreshKey = ['A', 'B01', 'B02', 'B03', 'B04', 'B05', 'B06', 'B07', 'B08', 'B09', 'B10'];
let key = 0;
let keyValue = 'A';
function getFreshKey () {
key++
if (key === 10) {
key = 0
}
keyValue = refreshKey[key]
}
上滑加載 :on-infinite="infinite"
infinite () {
this.$jsonp(`http://3g.163.com/touch/jsonp/sy/recommend/${start}-${end}.html`, {
miss: '00',
refresh: keyValue
}).then(data => {
/* 這裏是獲取的數據 */
console.log(data)
// 處理文章列表數據
(省略同上)
start += 10;
end = start + 9;
this.$refs.myRef.finishInfinite() ;//中止上滑刷新
//this.$refs.myRef這個是咱們在scroller上綁定的ref屬性,就像dom操做中選中某一個元素同樣
})
注意:這樣操做的上滑加載出來的數據,是追加上來的,這樣的話列表的數據就會愈來愈多,若是但願每次上滑的時候,就把原來的內容替換掉的話,
能夠這麼寫:
infinite () {
this.$jsonp(`http://3g.163.com/touch/jsonp/sy/recommend/${start}-${end}.html`, {
miss: '00',
refresh: keyValue
}).then(data => {
/* 這裏是獲取的數據 */
console.log(data)
// 處理文章列表數據
(省略同上)
this.panelList=this.pannelList.concat(panelList);//數據拼接
start += 10;
end = start + 9;
this.$refs.myRef.finishInfinite() ;//中止上滑刷新
//this.$refs.myRef這個是咱們在scroller上綁定的ref屬性,就像dom操做中選中某一個元素同樣
})
f)文本提示更新
引入toast 提示組件 import { ToastPlugin } from 'vux',Vue.use(ToastPlugin)
而後把這句代碼寫在refresh 函數中便可
this.$vux.toast.text(`本次共刷新了${this.panelList.length}條數據`)
5.導航欄的設置
在conponents中分別註冊news,movei,music等組件,並把他們引入到router文件夾下的index.js文件中,配置好路由的名稱路徑等信息,而後就能夠把路由
綁定到導航上了,默認第一個進入的就是新聞的界面,其餘界面暫未完成,設置爲空白頁
<tabbar-item selected link="/">
<img slot="icon" src="./assets/icon-1.png">
<span slot="label">新聞</span>
</tabbar-item>
5、打包與發佈
打包:執行npm run build ,完成後會生成一個dist的文件
發佈:把文件發送到github上面,具體步驟見資料參考
6、問題與改進
1.上滑刷新時速度過快,可把刷新的數據寫到一個定時器中
2.在發佈到git以後,控制檯依然提示有錯誤,暫時未找到解決方法
7、資料參考:
1.如何在github搭建本身的項目: https://blog.csdn.net/liwenjieit/article/details/78230003
2.vue-scroller的詳細用法:https://www.jianshu.com/p/31ad32e7ec13
3.es6 簡明教程:http://www.runoob.com/w3cnote/es6-concise-tutorial.html
4.vue.js :http://www.runoob.com/vue2/vue-tutorial.html
5.vue-jsonp解決跨域處理:https://www.cnblogs.com/xiaoli52qd/p/7235901.html
6.jsonp請求百度搜索接口:https://www.jianshu.com/p/8d3b27cc37e7
瀏覽地址: