- 组件化开发,标题部分
- 多处用到的代码就在全局进行注册
- 优化用户体验:当网速过慢时,显示加载动画。
- 播放宣传片
- 保留组件状态,避免从新渲染
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,未完。。