this.$refs.mask.forEach()报错。

来源:5-16 目录加载动画实现(动画效果实现)

丛从绿草

2021-06-09

<!--
 * @Author: your name
 * @Date: 2021-06-09 15:00:28
 * @LastEditTime: 2021-06-09 15:42:35
 * @LastEditors: Please set LastEditors
 * @Description: In User Settings Edit
 * @FilePath: \bazai_ebook\src\components\ebook\EbookLoading.vue
-->
<template>
  <div class="ebook-loading">
    <div class="ebook-loading-wrapper">
        <div
          class="ebook-loading-item"
          v-for="(item, index) of data"
          :key="'item' + index"
        >
          <div
            class="ebook-loading-line-wrapper"
            v-for="(subItem, subIndex) in item"
            :key="'subItem' + subIndex"
          >
            <div class="ebook-loading-line" ref="line"></div>
            <div class="ebook-loading-mask" ref="mask"></div>
          </div>
        </div>
        <div class="ebook-loading-center"></div>
    </div>
  </div>
</template>

<script>
import { px2rem } from '@/utils/utils'
export default {
  name: 'EbookLoading',
  data () {
    return {
      data: [
        [{}, {}, {}],
        [{}, {}, {}]
      ],
      maskWidth: [
        { value: 0 },
        { value: 0 },
        { value: 0 },
        { value: 0 },
        { value: 0 },
        { value: 0 }
      ],
      lineWidth: [
        { value: 16 },
        { value: 16 },
        { value: 16 },
        { value: 16 },
        { value: 16 },
        { value: 16 }
      ],
      add: true,
      end: false
    }
  },
  mounted () {
    this.task = setInterval(() => {
        console.log('mask', this.$refs.mask)
        this.$refs.mask.forEach((item, index) => {
        const mask = this.$refs.mask[index]
        const line = this.$refs.line[index]
        const maskWidth = this.maskWidth[index]
        const lineWidth = this.lineWidth[index]
        if (index === 0) {
          if (this.add && maskWidth.value < 16) {
            maskWidth.value++
            lineWidth.value--
          } else if (!this.add && lineWidth.value < 16) {
            maskWidth.value--
            lineWidth.value++
          }
        } else {
          if (this.add && maskWidth.value < 16) {
            const preMaskWidth = this.maskWidth[index - 1]
            if (preMaskWidth.value >= 8) {
              maskWidth.value++
              lineWidth.value--
            }
          } else if (!this.add && lineWidth.value < 16) {
            const preLineWidth = this.lineWidth[index - 1]
            if (preLineWidth.value >= 8) {
              maskWidth.value--
              lineWidth.value++
            }
          }
        }
        mask.style.width = `${px2rem(maskWidth.value)}rem`
        mask.style.flex = `0 0 ${px2rem(maskWidth.value)}rem`
        line.style.width = `${px2rem(lineWidth.value)}rem`
        line.style.flex = `0 0 ${px2rem(lineWidth.value)}rem`
        if (index === this.maskWidth.length - 1) {
          if (this.add) {
            if (maskWidth.value === 16) {
              this.end = true
            }
          } else {
            if (maskWidth.value === 0) {
              this.end = true
            }
          }
        }
        if (this.end) {
          this.add = !this.add
          this.end = false
        }
      })
    }, 20)
  }
}
</script>

<style lang="scss" rel="stylesheet/scss" scoped>
.ebook-loading {
  position: relative;
  z-index: 400;
  width: px2rem(63);
  height: px2rem(40);
  background: transparent;
  border: px2rem(1.5) solid #d7d7d7;
  border-radius: px2rem(3);
  .ebook-loading-wrapper {
    display: flex;
    width: 100%;
    height: 100%;
    .ebook-loading-item {
      display: flex;
      flex-direction: column;
      flex: 1;
      padding: px2rem(7) 0;
      box-sizing: border-box;
      .ebook-loading-line-wrapper {
        flex: 1;
        padding: 0 px2rem(7);
        box-sizing: border-box;
        @include left;
        .ebook-loading-line {
          flex: 0 0 px2rem(16);
          width: px2rem(16);
          height: px2rem(2);
          background: #d7d7d7;
        }
        .ebook-loading-mask {
          flex: 0 0 0;
          width: 0;
          height: px2rem(2);
        }
      }
    }
    .ebook-loading-center {
      position: absolute;
      left: 50%;
      top: 0;
      width: px2rem(1.5);
      height: 100%;
      background: #d7d7d7;
    }
  }
}
</style>

这里代码执行, 报错, 我看了源码一样的, 难道源码没有报错嘛 ? 这里this.$refs.mask.forEach(), 这句应该不对吧,

EbookLoading.vue?a97c:64 Uncaught TypeError: _this.$refs.mask.forEach is not a function

写回答

1回答

扬_灵

2021-06-09

同学你好,这里的this.$refs.mask获取的是加载目录动画时候的样式,我在本地运行了你的代码是可以打印的,但是因为没有效果定时器所以会一直打印下去。//img.mukewang.com/szimg/60c08631098c5fb023620928.jpg

0
1
YL菜鸟
我也遇到同样的问题,this.$refs.mask获取到的是一个节点,而不是一个数组
2021-09-05
共1条回复

Vue 实战商业级读书Web APP完整项目

Vue全家桶+最新前端技术+前后端分离架构,完整项目流程

1623 学习 · 1951 问题

查看课程