我有一个组件需要使用DOM计算一些值,因此我有onMounted()
生命周期挂钩。在onMounted()
中,我计算一些依赖于DOM元素的值(从技术上讲,它们是计算属性)。
然后我使用另一个计算属性leftOffset
中的值。我需要在template
中使用leftOffset
(它改变了一些CSS,并不真正相关)。
以下是我的setup()
:
setup() {
let showContent = ref(false);
let windowWidth = ref(null);
let contentHider = ref(null);
let contentHiderXPos ;
let contentHiderWidth ;
let leftWidth;
onMounted(() => {
// The DOM element will be assigned to the ref after initial render
windowWidth = ref(window.innerWidth);
contentHiderXPos = computed(() => contentHider.value.getBoundingClientRect().left);
contentHiderWidth = computed(() => contentHider.value.getBoundingClientRect().width);
leftWidth = computed(() => contentHiderXPos.value + contentHiderWidth.value);
});
let leftOffset = computed(() => {
return -(windowWidth.value - leftWidth.value)
});
return {
contentHider,
leftOffset,
}
contentHider
引用了template
中定义的一个div的DOM元素。
我的问题是,leftOffest.value
是未定义的,因为它试图访问windowWidth.value
和leftWidth.value
,这也是未定义的。我也试着把leftOffset
放在onMounted()
里面,但是我无法从template
访问它(它是未定义的)。
我如何re-structure我的代码,以便leftOffset
既可以从template
访问,也可以访问onMounted()
中的值?
我在网上搜索过,但找不到任何特定于CompositionAPI的内容。
您对
ref
的使用是错误的。按照下面代码段中的注释进行操作。这也是假设您不希望window.innerwidth是reactive。
如果希望
innerWidth
为reactive,则必须像这样使用本机事件侦听器;