vue3同一页面内重复引用同一操作dom的组件产生的问题

发布时间 2023-08-28 12:46:03作者: 邪妖怪
[2023年8月28日12:39:40]

vue3同一页面内标签<component>重复引用同一组件,且该组件内使用css选择器进行dom操作导致页面内相同组件发生变化的问题解决记录

组件内进行dom操作,需要通过js方法进行选择器的元素获取,但当vue3全部渲染完毕后,页面内有多个id为test9的相同元素,元素选择将变得模糊,如下:

document.querySelectorAll('#test9 table tbody')[0]

解决办法是把上面的js方式改成ref进行引用,并在异步加载该组件时进行markRaw,标记组件为非响应式,提高渲染性能

// 组件内
<template>
  ......
  <tbody ref="tbody">
    ...
  </tbody>
</template>

<script>
  // 用 tbody.value去做dom操作
  const tbody = ref<any>(null)
</script>
// 多次引用该组件的父级页面
<template>
  ......
  // v-for循环 item
  <component
    :is="item.component"
    class="grow"
  />
</template>

<script>
  function getComponent(name: string): Component {
  return markRaw(defineAsyncComponent('..需要多次渲染的组件路径'))
}
</script>