基於VUE,VUX組件開發的網易新聞頁面搭建過程

 

根據妙味課堂上的一個教程練習總結,供本身複習用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等組件,這裏咱們提早安裝好相關的依賴

  • 執行npm i -D less less-loader 
  • 引入樣式重置 @import '~vux/src/styles/reset.less',這個放在App.vue的style中,同時設置style的屬性 lang=less
  • 執行npm install vux-loader --save-dev,而後在webpack.dev.conf.js中配置

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>

咱們分別引入如下組件:

  • viewBox:總體的佈局組件,之後其餘的組件也是放到這個組件中的,須要設置body,html以及父組件的高度
  • XHeader:頭部組件,最上方顯示名稱的地方
  • Tabbar,TabbarItem:底部導航組件
  • Swiper:輪播圖組件
  • Marquee:文字滑動組件,跑馬燈效果
  • Panel:圖文列表組件

組件引入完畢,先根據官方文檔查看相應的設置,數據先填充案例裏的,總體界面能正常運行便可。

 

4.數據加載

a) 數據來源準備:

  • 首屏推薦新聞:http://3g.163.com/touch/jsonp/sy/recommend/0-9.html
  • 下拉或上滑加載更多的切換新聞:'http://3g.163.com/touch/jsonp/sy/recommend/'+start+'-'+end+'.html'
  • 刷新須要傳入的參數:miss:'00',refresh:['A','B01','B02'.....'B10'],共11個
  • 首頁所需數據格式:
  • 輪播圖數據:SwiperList: url, img, title 
  • 文字滑動數據:MarqueeList:  title 
  • 新聞列表數據:PanelList:src, title, desc, url

b) vue jsonp 解決跨域處理:

  • 執行npm i -S vue-jsonp 來安裝vue jsonp;
  • 在main.js中導入vue-jsonp,執行import VueJsonp from 'vue-jsonp';
  • 經過use方法,掛載到vue中,vue.use(VueJsonp)

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


瀏覽地址:
 https://cytheria123.github.io/test/
相關文章
相關標籤/搜索