组件优化

从整个项目来看,还需要优化的地方就是Header组件,因为项目中Header组件在App.vue中是单独的一个,Detail.vue中是单独的一个,Account.vue中又是单独的一个,虽然这三个Header都可以实现同步控制VueX中的主题状态,但是没有达到组件复用性。
image.png
image.png
image.png
他们都有一个公共的左中右结构,并且都可以实现点击换肤功能,所以可以将这一特性抽离出来,封装为一个公共的组件。不同的地方使用具名插槽的思想来替换其中的内容。

  1. <!-- Header.vue -->
  2. <template>
  3. <div class="header" @click="changeTheme">
  4. <!-- 注意点:不能直接设置插槽的样式 -->
  5. <div class="header-left">
  6. <slot name="left">左边</slot>
  7. </div>
  8. <slot name="center" class="">中间</slot>
  9. <div class="header-right">
  10. <slot name="right">右边</slot>
  11. </div>
  12. </div>
  13. </template>
  14. <script>
  15. import { mapActions } from 'vuex'
  16. export default {
  17. name: 'Header',
  18. methods: {
  19. ...mapActions([
  20. 'setTheme'
  21. ]),
  22. changeTheme () {
  23. // 循环主题索引
  24. this.setTheme()
  25. }
  26. }
  27. }
  28. </script>
  29. <style scoped lang="scss">
  30. @import "../assets/css/variable";
  31. @import "../assets/css/mixin";
  32. .header{
  33. width: 100%;
  34. height: 100px;
  35. @include bg_color();
  36. display: flex;
  37. justify-content: space-between;
  38. align-items: center;
  39. padding: 0 20px;
  40. .header-left,
  41. .header-right{
  42. width: 84px;
  43. height: 84px;
  44. text-align: center;
  45. line-height: 84px;
  46. }
  47. }
  48. </style>

其他界面中使用:

  1. <!-- App.vue -->
  2. <template>
  3. <Header class="header">
  4. <div slot="left" class="header-left">
  5. <i :class="['iconfont', curThemeIcon]" ref="headericon"></i>
  6. </div>
  7. <p slot="center" class="header-title">南先生的网易云</p>
  8. <div slot="right" class="header-right" @click.stop="accountClick">
  9. <i class="iconfont icon-yonghu"></i>
  10. </div>
  11. </Header>
  12. </template>

缓存特定组件

在整个项目中,网络请求量最大的就是歌手页,但是歌手页的数据一经获取之后其实不会有太多变动的地方,所以可以将此组件缓存起来,下一次切换到该组件就不会重新获取数据了,减轻了服务器的压力。还有搜索界面其实也是基本固定的,所以可以将这两个组件一同缓存起来。方法很简单,可以利用keep-alive对特定组件进行缓存。详细可参考官网

  1. <template>
  2. <div id="app">
  3. <MainHeader></MainHeader>
  4. <Tabbar></Tabbar>
  5. <keep-alive include="Singer, Search">
  6. <router-view></router-view>
  7. </keep-alive>
  8. <Player></Player>
  9. </div>
  10. </template>