vue跑马灯

vue跑马灯

使用elementui的布局组件实现列宽度

vue 复制代码
<template>
  <div class="lamp-container">
    <div class="lamp-header">
      <el-row :gutter="10">
        <el-col v-for="col in column" :key="col.prop" :span="col.span || 6">
          <slot :name="col.headSlot" :col="col">{{ col.label }}</slot>
        </el-col>
      </el-row>
    </div>
    <div
      class="lamp-wrapper"
      :style="{ height: height + 'px' }"
      ref="wrapper"
      @mouseover="stopCount"
      @mouseout="count"
    >
      <div class="lamp-list" ref="list">
        <div class="lamp-slide" v-for="item in data">
          <el-row :gutter="10">
            <el-col v-for="col in column" :key="col.prop" :span="col.span || 6">
              <slot :name="col.slot" :row="item">{{ item[col.prop] }}</slot>
            </el-col>
          </el-row>
        </div>
      </div>
      <div class="lamp-list" v-if="showClone">
        <div class="lamp-slide" v-for="item in data">
          <el-row :gutter="10">
            <el-col v-for="col in column" :key="col.prop" :span="col.span || 6">
              <slot :name="col.slot" :row="item">{{ item[col.prop] }}</slot>
            </el-col>
          </el-row>
        </div>
      </div>
    </div>
  </div>
</template>

<script>
/**
 * @file 跑马灯组件 my-lamp
 * @author 孔
 * @date 2023-12-25
 * @param column {() => ({
 *  label: '名称',  列标题
 *  prop: 'name',   data 中的属性
 *  span: 6, 列宽度
 *  slot: 'name', 数据插槽
 *  headSlot:'name', 表头插槽}[])} 列配置
 * @param data {Array} 数据
 * @param height {Number} 高度
 * @param speed {Number}    速度
 * @slot headSlot {String} 表头插槽
 * @slot slot {String} 数据插槽
 *
 * column item配置   {
 * }
 */
export default {
  name: "MyLamp",
  props: {
    column: Array,
    data: Array,
    height: {
      type: [Number, String],
      default: 200,
    },
    speed: {
      type: Number,
      default: 1,
    },
  },
  data() {
    return {
      showClone: false,
      timer: null,
    };
  },
  watch: {
    data: {
      handler() {
        this.init();
      },
      deep: true,
      immediate: true,
    },
  },
  beforeDestroy() {
    if (this.timer) clearInterval(this.timer);
  },
  methods: {
    init() {
      this.$nextTick(() => {
        if (this.$refs.list.offsetHeight > this.height) {
          this.showClone = true;
          this.count();
        } else {
          this.showClone = false;
          this.stopCount();
        }
      });
    },
    stopCount() {
      if (this.timer) clearInterval(this.timer);
    },
    count() {
      if (!this.showClone) return;
      if (this.timer) clearInterval(this.timer);
      this.timer = setInterval(() => {
        this.Marquee();
      }, 50);
    },
    Marquee() {
      if (this.$refs.wrapper.scrollTop >= this.$refs.list.offsetHeight) {
        this.$refs.wrapper.scrollTop = 0;
      } else {
        this.$refs.wrapper.scrollTop += Number(this.speed);
      }
    },
  },
};
</script>

<style scoped>
.lamp-header {
  height: 40px;
  line-height: 40px;
  text-align: center;
  font-size: 14px;
}
.lamp-wrapper {
  overflow: hidden;
  position: relative;
}
.lamp-wrapper .lamp-slide {
  height: 40px;
  line-height: 40px;
  text-align: center;
}
.lamp-wrapper .lamp-slide:nth-child(even) {
  background: #08247e;
}
</style>

组件props

属性 类型 说明 默认值
column colOption[] 列配置 -
data Array 显示得数据 -
height Number|String 滚动区域高度 200
speed Number 滚动速度 1

colOption

属性 类型 说明 默认值
label String 列名称 -
prop String data中得属性 -
span Number 列宽度 6
headSlot String 列头插槽名称 -
slot String 列插槽名称 -
相关推荐
wangan0947 分钟前
不带圆圈的二叉树
java·前端·javascript
狗哥哥8 分钟前
从零到一:打造企业级 Vue 3 高性能表格组件的设计哲学与实践
前端·vue.js·架构
计算机毕设VX:Fegn089513 分钟前
计算机毕业设计|基于springboot + vue图书借阅管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
JohnYan32 分钟前
Bun技术评估 - 22 Stream
javascript·后端·bun
Aevget35 分钟前
界面控件DevExpress JS & ASP.NET Core v25.1 - 全新的Stepper组件
javascript·asp.net·界面控件·devexpress·ui开发
林希_Rachel_傻希希41 分钟前
手写Promise最终版本
前端·javascript·面试
该用户已不存在1 小时前
Node.js后端开发必不可少的7个核心库
javascript·后端·node.js
褪色的笔记簿1 小时前
在 Vue 项目里管理弹窗组件:用 ref 还是用 props?
前端·vue.js
一只小阿乐1 小时前
前端vue3 web端中实现拖拽功能实现列表排序
前端·vue.js·elementui·vue3·前端拖拽
AAA阿giao1 小时前
从“操纵绳子“到“指挥木偶“:Vue3 Composition API 如何彻底改变前端开发范式
开发语言·前端·javascript·vue.js·前端框架·vue3·compositionapi