目前一期只是爲App內某個模塊資訊模塊文章的分享和APP下載,後續還會有更多的功能,爲了項目可擴展、可伸縮結合了我之前的實踐搭建了此項目項目地址,若是這個簡單的項目能給您帶來幫助請給小哥哥⭐Star好很差(手動筆芯)。javascript
Vue
,VueRouter
,Vuex
三件套不在多說css
主要用來發起Http請求,想要詳細瞭解具體使用方式和操做指南能夠請參考筆者下面的幾篇文章
Axios全攻略
Vuex2和Axios的開發
注意:由於Axios
使用了Promise
,適配低版本瀏覽器 必定要配合使用es6-promise
html
Vuex-router-sync資料
功能:將Router中的 這些數據注入到Store中,方便咱們調用。
在此項目中 我用此插件獲取URL上的文章IDvue
Vue-meta資料
功能:改變網頁Head上的一些標籤值。
在此項目中,我用此插件改變文章頁面上的Title,在瀏覽器中標題不那麼木訥。java
Mobi.css資料
功能:小而精美的手機端CSS佈局庫
在此項目中,不想用太大的UI框架也不想本身寫太多的樣式,選擇了它。ios
Vue-infinite-loading資料
功能:緩解加載數據時頁面空白的尷尬,可自定義loading動畫。git
和APP的同窗商量了咱們就用http://xxxx/article/:id的方式去定義分享出去文章地址,頁面經過得到URL上的
ID去請求相對應的數據。我是使用Vuex-router-sync
直接從Store中得到ID的rootState.route.params.id
es6
// 文件src/modules/action /** 獲取文章信息 */ export const getArticle = ({ rootState, commit }) => { return new Promise((resolve, reject) => { axios({ method: 'get', url: 'share/news_details', params: { news_id: rootState.route.params.id } }) .then((response) => { commit(types.ARTICLE, response.data.data) resolve(response) }) .catch((error) => { reject(error) }) }) }
在每一個頁面進行操做時,咱們須要鑑別當前系統是IOS或者安卓,每次經過正則去鑑別UA裏的字符串太麻煩,因此我將此放到Store中,方便全部的組件使用github
// 文件src/modules/store const state = { system: (/iphone|ipad|ipod/.test(navigator.userAgent.toLowerCase()) ? 'IOS' : 'Android'), article: {}, isWeixin: (/MicroMessenger/ig).test(navigator.userAgent) }
咱們去加載數據時可能會遇到失敗的狀況,這裏須要對頁面有一個良好的處理,這裏我主要使用Vue-infinite-loading
去實現頁面上的效果。vuex
_onInfinite () {
this.getArticle().then(() => { // 完成以後loading消失 this.$refs.infiniteLoading.$emit('$InfiniteLoading:loaded') this.$refs.infiniteLoading.$emit('$InfiniteLoading:complete') }) .catch(() => { // 異常以後頁面的展現 執行下方slot="no-results"部分 this.$refs.infiniteLoading.$emit('$InfiniteLoading:complete') }) }
<infinite-loading :on-infinite="_onInfinite" ref="infiniteLoading" spinner="bubbles"> <span slot="no-results">好像來到了奇怪的地方~</span> <span slot="no-more"></span> </infinite-loading>
這是一個很能提升頁面性能的標籤,會將已使用過的不活動的組件緩存起來而不是銷燬。在性能不太好的手機上,模版的渲染也是須要必定時間的,咱們能夠用這個標籤將緩存曾經使用過的組件(頁面),在此組件激活時刷新裏面的數據便可。激活時使用activated這個生命週期
activated
activated () {
this.clearArticle() //激活時先清除Store中的數據 由於$InfiniteLoading是根據頁面高度來發起請求的 this.$refs.infiniteLoading.$emit('$InfiniteLoading:reset') }
始終基於模塊的方式來構建你的 app,每個子模塊只作一件事情。
Vue.js 的設計初衷就是幫助開發者更好的開發界面模塊。一個模塊是應用程序中獨立的一個部分。
咱們須要將咱們*.vue
文件按照必定的結構組織,使得組件便於理解,主要有如下幾點比較重要:
同時配合ESLint
將代碼寫的更加規範和閱讀,我這邊使用Standard
的風格,在VScode中也開啓了Standard的驗證。
ESLint官網
JavaScript 代碼規範-Standard風格
組件規範也能夠參考筆者這篇:Vue.js 組件編碼規範
看起來此項目簡單,實則上用了很多插件去實現須要較強的動手(第三方坑也多,選擇一個好的插件得先去github上看看,做者的代碼質量),須要保持必定的彈性方便往後的擴展也要避免過分的設計。你們若想要加速本身的開發速度,能夠多逛逛Vue awesome上看看大多數都是高質量的插件,其實不少輪子都有人造好了,選取好的直接拿來用豈不妙哉?