当前位置: 首页 > 知识库问答 >
问题:

前端 - Countups.js相关问题?

贺正祥
2024-05-10

<script setup lang="ts">
import UserCommodityInfo from "@/store/home/commodity/Info.ts";
import { storeToRefs } from "pinia";
import CardChild from './CardChild/index.vue'

import { ref, onMounted } from "vue";
import { CountUp } from "countUp.js";
// 拿到服务器商品信息的数据
const UserCommodityInfos = UserCommodityInfo();
UserCommodityInfos.getReqCommodityInfo();
const { Reqdata } = storeToRefs(UserCommodityInfos);

let Count = ref<HTMLElement>();

onMounted(() => {
// 创建CountUp实例
const Countups = new CountUp(Count.value!, 1000);
console.log(Count.value);

// 开始执行
Countups.start();

});

</script>

<template>
<el-row justify="space-between" :gutter="10">

<template v-for="item in Reqdata" :key="item.amount">  <el-col :span="6">   <CardChild v-bind="item"></CardChild>   <span ref="Count">0</span>  </el-col></template>

</el-row>
</template>

<style scoped lang="less">

</style>

当span被包裹在el-col 中时代码中拿到的Count实例是undefined,如果将他抽成一个组件(CardChild)就不会出现拿不到实例对象(看上面代码)

CardChild组件:

<script setup lang="ts">
import { ref, onMounted } from "vue";
import { CountUp } from "countUp.js";

const prop = defineProps({
title: {

type: String,

},
tips: {

type: String,

},
number1: {

type: Number,

},
number2: {

type: Number,

},
subtitle: {

type: String,

},
});
// 变量**
// 获取需要执行CountUp的组件实例
let Count1 = ref<HTMLElement>();
let Count2 = ref<HTMLElement>();

onMounted(() => {
// 创建CountUp实例
const Countup1 = new CountUp(Count1.value!, prop.number1 ?? 0);
const Countup2 = new CountUp(Count2.value!, prop.number2 ?? 0);
// 开始执行
Countup1.start();
Countup2.start()
});

</script>

<template>
<div class="card">

<div class="head">  <h2>{{ title }}</h2>  <el-tooltip class="box-item" effect="light" :content="tips" placement="top">    <el-icon><Warning /></el-icon>  </el-tooltip></div><div class="conter">  <span ref="Count1">{{ number1 }}</span></div><div class="footer">  <h4 >{{ subtitle }} <span ref="Count2">{{ number2 }}</span></h4></div>

</div>
</template>

共有1个答案

斜博超
2024-05-10

问题的根源在于,你在父组件中使用ref来尝试引用模板中的<span>元素,但是ref是在循环v-for中使用的,这会导致ref指向不确定的元素,或者可能根本指向不到任何元素。在Vue 3中,使用ref在循环中引用DOM元素是不推荐的,并且可能不会按预期工作。

对于你提到的情况,如果你将<span>抽离成CardChild组件,并且在这个组件内部使用refonMounted来初始化CountUp,那么每个CardChild实例都会有它自己的refCountUp实例,因此不会出现undefined的问题。

然而,如果你希望在父组件中管理所有的CountUp实例,那么你需要找到一种方式来为每个<span>创建一个唯一的ref。你可以使用Vue 3的v-for:ref的绑定语法,但这需要一些额外的逻辑来管理这些ref

另外,请注意,CountUp库是用来在DOM元素上执行数字动画的,所以你需要确保在DOM元素可用时初始化它。如果元素在初始化CountUp时不可用(比如因为v-if条件未满足或者仍在等待异步数据),那么CountUp实例可能会是undefined或者无法正常工作。

对于你的代码,一个可能的解决方案是在CardChild组件内部管理CountUp的初始化,这样每个组件实例都可以独立处理其数字动画。如果你确实需要在父组件中管理这些实例,你可能需要重构代码以使用更复杂的逻辑来跟踪和初始化每个CountUp实例。

总之,你遇到的问题是因为在循环中使用了ref,并且可能没有在DOM元素可用时初始化CountUp。你应该确保在适当的时机和上下文中初始化你的CountUp实例。

 类似资料:
  • 在放开最后一行注释后执行 : A的引用内存反而降低了,A对B的引用好像并没有解除,为什么会降低内存了? 为什么A对象的内存降低了呢

  • 网站搭建萌新,有些疑惑希望大佬们可以解答: nginx、tomcat与云服务器(如阿里云、腾讯云等)、机房实体服务器有啥区别? 搭建网站的时候什么时候用nginx和tomcat,以及详细原因(比如为啥tomcat大多用于前端到后端的中间件,而nginx为啥大多用于用户到浏览器的中间件?) 搭建网站,前后端分别部署在不同服务器上,以前端访问后端为例,在已实现跨域的前提下,能否通过 前端向后端服务器的

  • 本页列出注解相关常见问题,欢迎大家补充。 如何忽略一些我不想被扫描到的类? 在项目配置文件中配置: return [ // 忽略扫描的命名空间 'ignoreNamespace' => [ 'Imi\Test\Component\Annotation\A\*', // 忽略扫描该命名空间下所有类 'Imi\Test\Component\A

  • 如何获取QQ登录的unionId? 在AuthConfig中设备unionId为true AuthRequest authRequest = new AuthQqRequest(AuthConfig.builder() .clientId("clientId") .clientSecret("clientSecret") .redirectUri("

  • 升级到1.9.3+版本后编译失败 主要明显的就是IpUtils.getIp和request的.state报错。 这是因为从v1.9.3版本开始,对项目进行了一些优化,具体优化内容参考:v1.9.3 (opens new window)和v1.9.4 (opens new window)。 新版本的使用方式,参考JustAuth-demo (opens new window) @RequestMap

  • 如何读取FDS Sink中的数据 最终写入FDS Bucket中的文件内容格式如下: message header message content length of message bytes,即消息长度,长度为4字节 bytes array of message content,即用户发送的消息内容,长度为实际消息长度,和message header记录的长度相符 用户在处理FDS文件的时候,