• 在vue中使用mixin提高可复用性


    一、mixin(混入)的概念

    mixin是一个可以包含任意组件选项的对象

    export const mixin = {
      mounted() {
        this.handlePlayList()
      },
      methods: {
        handlePlayList() {
          throw new Error('component must implement handlePlayList method')
        }
      }
    }
    

    当组件使用 混入对象时,对象中的选项将被“混合”进入组件本身的选项

    也就是说,mixin对象内的各种钩子将会与组件本身的钩子进行合并

    如果数据对象使用了相同的名字,则会以组件本身的数据优先
    另外,混入对象的钩子将在组件自身钩子之前调用
    更详细的用法 请参考官方文档

    二、具体使用示例

    在一个音乐播放网站的开发过程中,遇到这么一个问题:
    当用户开始播放音乐、且退出全屏播放后,在窗口底部将会有一个固定高度的迷你播放器
    此时我们就需要对其他使用了better-scroll插件的页面进行调整
    让列表能滚动到最后一项(否则会被迷你播放器遮挡住)
    image.png

    解决思路是这样的:
    1、定义一个可复用的mixin对象
    2、在mixin对象中定义相关钩子,要求组件本身必须实现一个handlePlayListMixin方法
    3、在handlePlayListMixin方法中,设置列表距离页面底部的距离,并调用better-scroll的refresh方法(重新计算滚动数据)

    三、代码实现

    首先定义mixin对象

    import {mapGetters} from 'vuex'
    export const playListMixin = {
      computed: {
        ...mapGetters([
          'playList' //当前播放的歌曲列表
        ])
      },
      mounted() {
        this.handlePlayList(this.playList)
      },
      activated() {
        this.handlePlayList(this.playList)
      },
      watch: {
        playList(newVal) {
          this.handlePlayList(newVal)
        }
      },
      methods: {
        handlePlayList() {
          throw new Error('component must implement handlePlayList method')
        }
      }
    }
    

    在组件中引入并注册mixin
    并实现handlePlayListMixin方法(去覆盖mixin中的方法)

    import { playListMixin } from 'xxx'
    export default {
      name: 'xxx',
      mixins: [ playListMixin ],
      methods: {
        handlePlayListMixin (playList) {
          const bottomVal = playList.length > 0 ? '60px' : 0
          this.$refs.list.style.bottom = bottomVal
          this.$refs.list.refresh()
        }
      }
    }
    

    ref=list 的引用是添加在已经封装好的scroll组件上的

    若当前播放的歌曲列表不为空(即用户正在播放音乐)
    那么混入了mixin对象的组件 就会在mounted、activated(主要针对使用了keep-alive的组件)等钩子中,调用handlePlayListMixin方法
    从而调整列表距离页面顶部的距离,并令better-scroll重新计算滚动距离

  • 相关阅读:
    .Net 6+项目使用Husky.Net在项目提交时格式化代码
    maven 之将项目打包压缩。
    netty ChannelPipeline流处理源码详细分析
    maven 之 将资源文件 copy到classes目录中
    maven 之 根据不同环境,选择不同的配置文件。
    flex+spring+blazds 数据推送,client自动断开问题。
    C#如何读写xml文件
    序列化 与 反序列化
    DataSet与List的转换
    Python基础入门
  • 原文地址:https://www.cnblogs.com/baebae996/p/13858341.html
Copyright © 2020-2023  润新知