我想得到vue的尺寸.来自家长的js组件(我正在使用实验script setup).

当我在组件中使用ref时,它会按预期工作.我得到了尺寸:

// Child.vue
<template>
  <div ref="wrapper">
   // content ...
  </div>
</template>
<script setup>
import { ref, onMounted } from 'vue'

const wrapper = ref(null)

onMounted(() => {
  const rect = wrapper.value.getBoundingClientRect()
  console.log(rect) // works fine!
})
</script>

但我想得到父组件内部的尺寸.这可能吗?

我试过:

// Parent.vue
<template>
  <Child ref="wrapper" />
</template>
<script setup>
import Child from './Child'
import { ref, onMounted } from 'vue'

const wrapper = ref(null)

onMounted(() => {
  const rect = wrapper.value.getBoundingClientRect()
  console.log(rect) // failed!
})
</script>

控制台会记录此错误消息:


在文档中,我只能找到使用template refs inside the child component的方法

这种方法是否不起作用,因为参考点"默认关闭"为rfcs description says

推荐答案

我今天遇到了这个问题.问题是,当使用<script setup>模式时,没有一个声明的变量被返回.当你得到一个组件的引用时,它只是一个空对象.解决这个问题的方法是在设置块中使用defineExpose.

// Child.vue

<template>
  <div ref="wrapper">
   <!-- content ... -->
  </div>
</template>

<script setup>
import { defineExpose, ref } from 'vue'

const wrapper = ref(null)

defineExpose({ wrapper })
</script>

在父级中设置模板引用的方式很好.事实上,你在控制台中看到empty object { }意味着它正在工作.

就像前面提到的另一个答案一样,child ref可以像这样从父级访问:wrapper.value.wrapper.getBoundingClientRect().

rfc有一个部分讨论如何/为什么这样做:https://github.com/vuejs/rfcs/blob/master/active-rfcs/0040-script-setup.md#exposing-components-public-interface

还需要注意的是,对于<script setup>模式,父组件中的ref将不是ComponentInstance.这意味着你不能像打电话一样拨打$el.它将只包含您在defineExpose中输入的值.

Vue.js相关问答推荐

获取深度嵌套对象时无法读取空/未定义的属性

用于循环数组的模板元素内的条件渲染

将 html 文件移出 dist vite 中的 src 文件夹

Vuetify 3 v-radio-group 将模型设置为 null

vue3 + pinia:如何从?store 中获取一个值

TailwindCSS 为什么前者比后者重要?

使用 jquery-chosen 插件更新 vuejs 模型值

运行vue-cli-service build --watch时没有 CSS 文件

Vue动态mapGetters

如何在某些异步数据(在 Vuex 存储中)加载之前防止任何路由?

如何在 .js 文件中使用 Vue i18n 翻译?

webpack模块解析失败意外字符'@'

Laravel 事件未广播

如何使用 Vuejs 和 Laravel 获取当前经过身份验证的用户 ID?

如何突出显示 Vuetify 菜单中的选定项目?

Vue路由在新页面上回到顶部

组件已注册但未使用 vue/no-unused-components

vue 未在实例上定义,但在渲染期间引用

如何使用 Vuetify 验证复选框组

VueJS 2 + ASP.NET MVC 5