跳到内容

useResizeObserver

分类
导出大小
520 B
上次更改
5 天前

报告元素内容或边框尺寸的变化

演示

调整框大小以查看变化

用法

vue
<script setup>
import { useResizeObserver } from '@vueuse/core'
import { ref, useTemplateRef } from 'vue'

const el = useTemplateRef('el')
const text = ref('')

useResizeObserver(el, (entries) => {
  const entry = entries[0]
  const { width, height } = entry.contentRect
  text.value = `width: ${width}, height: ${height}`
})
</script>

<template>
  <div ref="el">
    {{ text }}
  </div>
</template>

指令用法

此函数还通过 @vueuse/components 包提供指令版本。 了解更多关于用法的知识

vue
<script setup lang="ts">
import { vResizeObserver } from '@vueuse/components'

const text = ref('')

function onResizeObserver(entries) {
  const [entry] = entries
  const { width, height } = entry.contentRect
  text.value = `width: ${width}, height: ${height}`
}
</script>

<template>
  <div v-resize-observer="onResizeObserver">
    {{ text }}
  </div>
</template>

ResizeObserver MDN

类型声明

显示类型声明
typescript
export interface ResizeObserverSize {
  readonly inlineSize: number
  readonly blockSize: number
}
export interface ResizeObserverEntry {
  readonly target: Element
  readonly contentRect: DOMRectReadOnly
  readonly borderBoxSize: ReadonlyArray<ResizeObserverSize>
  readonly contentBoxSize: ReadonlyArray<ResizeObserverSize>
  readonly devicePixelContentBoxSize: ReadonlyArray<ResizeObserverSize>
}
export type ResizeObserverCallback = (
  entries: ReadonlyArray<ResizeObserverEntry>,
  observer: ResizeObserver,
) => void
export interface UseResizeObserverOptions extends ConfigurableWindow {
  /**
   * Sets which box model the observer will observe changes to. Possible values
   * are `content-box` (the default), `border-box` and `device-pixel-content-box`.
   *
   * @default 'content-box'
   */
  box?: ResizeObserverBoxOptions
}
declare class ResizeObserver {
  constructor(callback: ResizeObserverCallback)
  disconnect(): void
  observe(target: Element, options?: UseResizeObserverOptions): void
  unobserve(target: Element): void
}
/**
 * Reports changes to the dimensions of an Element's content or the border-box
 *
 * @see https://vueuse.org.cn/useResizeObserver
 * @param target
 * @param callback
 * @param options
 */
export declare function useResizeObserver(
  target:
    | MaybeComputedElementRef
    | MaybeComputedElementRef[]
    | MaybeRefOrGetter<MaybeElement[]>,
  callback: ResizeObserverCallback,
  options?: UseResizeObserverOptions,
): {
  isSupported: ComputedRef<boolean>
  stop: () => void
}
export type UseResizeObserverReturn = ReturnType<typeof useResizeObserver>

源码

SourceDemoDocs

贡献者

Anthony Fu
Anthony Fu
IlyaL
Jelf
Hongkun
青椒肉丝
远方os
birdxiao
acyza
ByMykel
vaakian X
karma
Shinigami
Alex Kozack
Jacob Clevenger
Sanxiaozhizi
Antério Vieira
zhong666

更新日志

v12.8.0 于 2025/3/5
7432f - feat(types): 弃用 MaybeRefMaybeRefOrGetter,支持 Vue 原生 (#4636)
v12.3.0 于 2025/1/2
59f75 - feat(toValue): 弃用来自 @vueuse/sharedtoValue,支持 Vue 原生
v12.0.0-beta.1 于 2024/11/21
0a9ed - feat!: 移除 Vue 2 支持,优化包并清理 (#4349)
v11.1.0 于 2024/9/16
044dd - fix: 更新类型 (#4218)
v11.0.0-beta.2 于 2024/7/17
d4310 - feat: 添加了 vResizeObserver 指令 (#4008)
1c124 - fix: 修复 target 是 Ref 数组 (#4005)
v10.8.0 于 2024/2/20
48421 - fix: 不要深度监听以避免循环调用 (#3753)
v10.0.0-beta.2 于 2023/3/28
3e187 - feat: 支持元素列表 (#2841)

在 MIT 许可证下发布。