Vue3组合API窗口. ref数组的scrollTo元素

gzszwxb4  于 2022-11-17  发布在  Vue.js
关注(0)|答案(2)|浏览(274)

有人知道如何用复合API在Vue 3中获得元素的offsetTop吗?像这个版本的Vue 2?

goto(refName) { 
  var element = this.$refs[refName];
  var top = element.offsetTop;     
  window.scrollTo(0, top);
}

我的设置()中有:

const accordions = ref([]);
...
<Disclosure
    v-slot="{ open }"
    v-for="(region, index) of data"
    :key="index"
    :ref="(el) => pushToRef(el, index)"
  >...</Disclosure>

function pushToRef(el, index) {
  accordions[index] = el;
}

它被v-for的元素填充。我可以稍后从数组中取出代理。但不能取出偏移量:

const element = accordions[region]; 
console.log("Region: " + region); //got the name 
console.log("Element: ", element); // Proxy of element 
const top = element.offsetTop; // UNDEFINED ???
console.log("OffsetTop: " + top); // !!! Undefined 
window.scrollTo({ top: top, left: 0, behavior: "smooth", });
q0qdq0h2

q0qdq0h21#

我认为您的代码在组件装入之前就已运行。请尝试将其 Package 在onMounted

import { onMounted } from 'vue'

onMounted(() => {
  const element = accordions[region];
  const top = element.offsetTop;
  console.log("OffsetTop: " + top);
})
xxe27gdn

xxe27gdn2#

我不确定你是否想改变accordions,因为它是一个ref对象,但如果你在实际代码中这样做,你应该避免它,而是改变内部的值,即accordions.value
现在,由于Disclosure是一个组件而不是HTML元素,vue的template ref不会引用该元素的DOM,而是引用Disclosure组件的Vue示例。您可以在这里阅读更多相关内容。
您需要访问HTML元素的DOM,如下所示:el.$el,则可以访问包括offsetTop在内的所有DOM属性。
如果要检查组件示例的所有属性,可以在此处找到它们。
附注:此ref行为在Options API中也是相同的,也就是说,您将以类似的方式访问vue组件的DOM属性,如下所示:this.$refs['REF_NAME'].$el

相关问题