- 組件化開發,標題部分
- 多處用到的代碼就在全局進行註冊
- 優化用戶體驗:當網速過慢時,顯示加載動畫。
- 播放宣傳片
- 保留組件狀態,避免從新渲染
keep-alive
- 圖片懶加載
- 本節完整demo
第一節css
思想:不一樣種類的組件,劃分不一樣模塊html
從首頁進入詳情頁,標題文字會改變,也會多出一個返回按鈕,但樣式仍是不變的,因此這裏也能夠拆分爲一個組件(我不會告訴大家,是我在上一節玩忘記拆分了[/壞笑]),標題文字能夠用佔位符 <slot>
來解決,返回按鈕的顯示可使用 v-if
vue
搞起!ios
在 components 文件夾下新建組件 pageTitle.vue
,而後把標題部分拆分出來:git
<template> <div class="pageTitle"> <div class="goback" v-if='showBack' @click="$router.back()"> <img src="@/assets/img/back.png" > </div> <slot></slot> </div> </template> <script> export default { name: 'pageTitle', props: ['showBack'] // 經過這個屬性肯定是否顯示返回圖標 } </script> <style lang="scss" scoped> .pageTitle { height: 51px; width: 100%; background-color: rgb(229, 72, 71); text-align: center; line-height: 51px; color: #fff; font-size: 1.1em; >.goback { position: absolute; left: 12px; top: 8px; >img { width: 35px; } } } </style>
而這個組件會被多個頁面使用,因此進行全局註冊github
在 main.js
中:ajax
// ... import pageTitle from './components/pageTitle' // 註冊全局組件 Vue.component('pageTitle',pageTitle) // ...
而後就能夠在其它頁面使用啦vuex
在 index.vue
中進行以下修改,不會顯示返回按鈕:npm
在 movieDetail.vue
中加入如下代碼,參數不懂的看前兩節axios
到這裏,這個標題組件已經拆分完成。
加載動畫也算是一個單獨的組件,但它不屬於頁面中的某一板塊,這種組件能夠再劃分紅一個組件模塊,爲這些組件也建立一個文件夾(由於這個項目不大,也能夠不用劃分的這麼細,直接把他寫到 components 裏面,但這裏主要介紹作項目的一個思想,這可能也與我的習慣有關) 。 以下:
而後,寫代碼:
<template> <div> <div class="loading-bg"> <img class="loading" src="../assets/img/loading.gif"> </div> </div> </template> <script> export default { name: "loading" }; </script> <style lang='scss' scoped> // ...樣式參考demo </style>
由於它也會在多個頁面中使用,因此把它也在 main.js
中註冊爲全局組件,而後就能夠在其它頁面中使用了。如今是否是已經對組件和組件化開發清晰了不少。
把它放在熱映頁,看一下效果:
emm,雖然不是那麼精緻,但效果仍是實現了。但它一直在轉圈圈啊,因此,要控制它一下。
(其實我以爲上面這個動圖作loading樣式也不錯 [/斜眼笑] )
而後,代碼搞起:
// 在須要使用這個組件的頁面中加入一個標記,這裏以hoting爲例 <template> <div> <!-- isReady: 數據加載好了就不顯示loading動畫 --> <loading v-if="!isReady"></loading> <div class="hoting"> <movie-list v-for="(h_item,index) in hotList" :key="index" :mitem="h_item"></movie-list> </div> </div> </template> <script> import movieList from "./movieList" import axios from 'axios' export default { name: "hoting", data() { return { isReady:false, // 記錄數據是否加載完畢 hotList: [] }; }, created() { axios .get("http://www.softeem.xin/maoyanApi/ajax/movieOnInfoList") .then(res => { this.hotList = res.data.movieList; this.isReady=true; //數據加載完畢 }); }, components: { movieList } }; </script> <style scoped> </style>
這個時候把網絡換成 Slow 3G
刷新頁面進行測試:
ok,完成了。效果還能夠呢,[🤩]
這裏主要用到 video
標籤,經過自定義屬性 showPlayVD
來控制顯示播放面板。樣式參考demo
<!-- 寫在movieDetail.vue --> <div class="play-vd" v-if="showPlayVD" @click="showPlayVD=false"> <video controls autoplay :src="movieDetail.vd" width="100%"> </video> </div>
點擊顯示播放面板
在開發Vue項目的時候,有一部分組件是不必屢次渲染的
方式:使用 keep-alive
包裹路由組件。
<keep-alive>
包裹動態組件時,會緩存不活動的組件實例,而不是銷燬它們。並且它自身不會渲染一個 DOM 元素,也不會出如今父組件鏈中。 keep-alive參考
keep-alive
,先進入詳情頁,而後把全部請求清空如今使用 keep-alive
(在App.vue文件中使用)
<template> <div id="app"> <keep-alive> <!-- 當前路由會被緩存 --> <router-view v-if="$route.meta.keepAlive"/> </keep-alive> <router-view v-if="!$route.meta.keepAlive"/> </div> </template>
而後更改路由配置:
// 路徑:router/index.js routes: [{ path: '/', name: 'index', component: index, meta:{ keepAlive:true // 在meta屬性中設置自定義屬性,爲true則保留路組件狀態 } } // ... ]
不使用圖片懶加載的狀況下,會在頁面第一次加載時,將全部圖片資源進行加載。假設有大量圖片資源須要加載,則等待加載完成會須要很長時間,極其影響用戶體驗。這個時候使用圖片懶加載就頗有必要性,它會只加載你當前屏幕中的圖片資源。
須要安裝 vue-lazyload
參考
npm install vue-lazyload -D
使用:
首先在main.js 文件中引入並使用
// 圖片懶加載 import VueLazyload from 'vue-lazyload' import errorImg from '../src/assets/img/error.png' import loadingImg from '../src/assets/img/loading.gif' // 加載懶加載插件 Vue.use(VueLazyload,{ error: errorImg, loading: loadingImg })
:src
修改成 v-lazy
便可,(這裏是 movieList.vue
文件)
- 本節完整 demo
- 還有底部菜單,vuex,未完。。