掘金文章归档 · 第 91 篇 Vue2 组件 · 问题排查

vue <marquee> 无法设置 loop 问题

模板里 loop="1" 渲染失效?用 ref 直接修改 DOM property 解决

原文作者:随意_(掘金) | juejin.cn/post/6952688804620664868 | 发布于 2021-04-19 | 阅读 652 · 约 1 分钟

0问题现象

vue 项目使用 marquee 文字轮播,设置 loop="1" 时无效,渲染为 loop:

<marquee loop="1">测试得数据</marquee>

html 渲染为(loop 属性丢失了值,致使 loop="1" 失效):

<marquee loop>测试得数据</marquee>
截图占位:浏览器元素面板中 marquee 渲染为 loop(无值)导致只滚动一次的目标失效
⚠️ marquee 是非标准废弃标签,其 loop 属性是数字型 DOM property(-1 表示无限循环)。Vue 模板渲染时按属性补丁处理,字符串 "1" 落库为 property 后序列化丢失值,导致循环次数不生效。

1解决方案

通过 vue ref 直接修改 marquee 元素的 loop property:

<template>
  <div>
    <marquee ref="marqueeEl">测试得数据</marquee>
    <button @click="setLoop">设置循环 1 次</button>
  </div>
</template>

<script>
export default {
  methods: {
    setLoop() {
      this.$refs.marqueeEl.loop = 1;
    }
  }
};
</script>

问题解决。

写法效果
模板 loop="1"属性值被吞,渲染为无值 loop,循环次数失效
ref 修改 loop = 1直接设置 DOM property,数值生效,滚动 1 次后停止
📌 对 marquee 这类原生数字属性,绕开模板补丁、用 ref 直接赋数字是最稳的解法。