我在vue 3中有这个组件:

<template>
    <div class="list-cell">
        <div
            v-for="(value, index) in lines"
            ref="items"
            :key="index"
            class="list-cell--item"
        >
            {{ value }}
        </div>
    </div>
</template>

<script setup lang="ts">
import { Ref, ref, onMounted, onUnmounted, PropType } from 'vue';

const items: Ref<HTMLElement[]> = ref([]);

defineProps({
    lines: { type: Array as PropType<string[]>, default: () => [] },
});

const handleMouseEnter = () => {
    console.log(1);
};
const handleMouseLeave = () => {
    console.log(2);
};

onMounted(() => {
    items.value.forEach((item) => {
        item.addEventListener('mouseenter', handleMouseEnter);
        item.addEventListener('mouseleave', handleMouseLeave);
    });
});
onUnmounted(() => {
    items.value.forEach((item) => {
        item.removeEventListener('mouseenter', handleMouseEnter);
        item.removeEventListener('mouseleave', handleMouseLeave);
    });
});
</script>

此组件是具有多行和翻页的表中单元格的简化版本.

它并不总是为所有单元格记录1或2 但如果我向事件监听器添加超时,它总是正确记录1或2:

setTimeout(() => {
    items.value.forEach((item) => {
        item.addEventListener('mouseenter', handleMouseEnter);
        item.addEventListener('mouseleave', handleMouseLeave);
    });
}, 5000);

有人知道为什么吗?

这是使用单元格的表:

<Table>
    <TableHeader
        slot="table-header"
        :columns="tableColumns"
    />
    <TableBody
        slot="table-body"
    >
        <TableRow
            v-for="(entity, index1) in dataSource"
            :key="currentItemOffset + index1"
            :row="entity"
            rowid="index1"
        >
            <TableCell
                v-for="(item, index2) in entity"
                :key="currentItemOffset + index2"
            >
                <ComponentWithIssue
                    :lines="item"
                ></ComponentWithIssue>
            </TableCell>
        </TableRow>
    </TableBody>
</Table>

推荐答案

OP通过使用以下事件解决了他的问题:

  • @mouseleave
  • @mouseenter

nextTick也可以使用,但它更像是一种黑客,而不是更好、更常见的做事方式.应偶尔与一些需要额外时间初始化的第三方包一起使用.尽管如此,从用户的用户体验Angular 来看,它还是比使用setTimeout更好.

Vue.js相关问答推荐

vue3中的转换可以在滑入但不能滑出时工作

在哪里可以找到在线沙箱 Vuetify 3 模板来创建最小的可重现示例?

vuejs中如何获取数组总长度

我如何使用 vuejs 在我的 url 中编码一个令牌

props至少应该定义它们的类型

Vue:在表格中显示嵌套数据

用 axios 搜索:新字符时取消之前的请求

Vue.js 开发工具未显示

在下拉菜单上使用箭头键滚动

为什么组件在 v-if 下没有被销毁

如何使 Rails 与 vue.js 一起工作?

如何在 vue.js 2 的其他组件中调用方法?

如何将 vuetify 2.0 beta 安装到新的 vue cli 项目中?

Vue-i18n '无法读取 Proxy.Vue.$t 处未定义的属性 '_t'

如何使用 JavaScript 按索引删除数组元素?

在找不到图像源时设置替代图像

中文而不是英文的Element UI分页

使用 Vue.js & DataTable(jquery 插件)

异步api调用后如何使用vuex getter

将 ref 的内容从子组件传递到另一个 VueJS 子组件