<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>
问题的根源在于,你在父组件中使用ref
来尝试引用模板中的<span>
元素,但是ref
是在循环v-for
中使用的,这会导致ref
指向不确定的元素,或者可能根本指向不到任何元素。在Vue 3中,使用ref
在循环中引用DOM元素是不推荐的,并且可能不会按预期工作。
对于你提到的情况,如果你将<span>
抽离成CardChild
组件,并且在这个组件内部使用ref
和onMounted
来初始化CountUp
,那么每个CardChild
实例都会有它自己的ref
和CountUp
实例,因此不会出现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文件的时候,