vue3怎样获取绑定页面dom元素

和vue2一样,vue3也可以在页面上通过ref绑定一个变量,

<div ref="domRef"></div>

但vue2使用this.$refs可以获取绑定的变量,而vue3虽然已经删除了this,但可以用以下方法绑定元素

在setup方法中使用vue提供的ref绑定元素,网上大部分是使用

import { onMounted, ref } from "vue";
export default{
    setup() {
        const domRef = ref(null)
        onMounted(() => {
            console.log(domRef.value)
        })
        retrurn {
            domRef
        }
    }
}

其实这还有优化的空间,我们使用vue3比较重要的是使用ts语法,那么怎么指定ref绑定的dom的class对象呢,我们可以不用在ref中写null,在ref中指定某个类的原型,那么value就是这个类的对象,我们可以使用js本身就有的Element对象,也可以自定义一个,最终代码如下所示:

①Ele.ts文件,用于声明class类局部使用,也可以使用.d.ts文件直接全局声明

export default class Ele {
  // eslint-disable-next-line @typescript-eslint/no-empty-function
  constructor() {}
  clientHeight!: number;
  clientWidth!: number;
  style!: {
    top: number | string;
    left: number | string;
    bottom: number | string;
    right: number | string;
    display: "inline-block" | "none";
  };
}

②通过Ele绑定ref

import { onMounted, ref } from "vue";
import Ele from "@/class/Ele";
export default{
    setup() {
        const domRef = ref(Ele.prototype)
        onMounted(() => {
            const dom: Ele = domRef.value;
            console.log(dom)
        })
        retrurn {
            domRef
        }
    }
}

<think>根据用户问题,用户需要的是在Vue3中通过ref绑定DOM元素获取其宽度的示例。用户的问题明确且具体,因此我将直接提供解决方案。在Vue3中,使用ref获取DOM元素获取其宽度的步骤如下:1.在模板中使用ref属性绑定DOM元素。2.在setup函数中声明一个ref变量,并将其返回。3.在onMounted生命周期钩子中或通过watchEffect等响应式API,在DOM渲染完成后访问该ref变量以获取元素的宽度。注意:由于DOM元素在setup函数执行时可能还未渲染,因此不能直接在setup函数中访问ref变量的值来获取宽度。我们需要确保在DOM挂载后再访问。下面是一个示例代码:</think>### Vue3 中使用 ref 获取 DOM 元素宽度的方法 在 Vue3获取 DOM 元素宽度的核心步骤如下: 1. **创建 ref 对象**:使用 `ref(null)` 创建响应式引用 2. **模板绑定**:通过 `ref="变量名"` 绑定 DOM 元素 3. **生命周期访问**:在 `onMounted` 或 `watchEffect` 中访问 DOM 4. **获取宽度**:通过 `element.offsetWidth` 或 `getComputedStyle()` 获取宽度 #### 完整示例代码 ```vue <template> <div> <!-- 绑定 ref 到目标元素 --> <div ref="targetElement" class="box"> 测量元素宽度 </div> <p>元素宽度: {{ width }}px</p> <button @click="updateWidth">重新测量</button> </div> </template> <script setup> import { ref, onMounted } from &#39;vue&#39; // 创建 ref 对象 const targetElement = ref(null) const width = ref(0) // 获取宽度的函数 function getWidth() { if (targetElement.value) { // 方法1:直接获取布局宽度 width.value = targetElement.value.offsetWidth // 方法2:获取计算样式(包含内边距/边框) // const style = getComputedStyle(targetElement.value) // width.value = parseFloat(style.width) } } // 挂载后获取初始宽度 onMounted(() => { getWidth() }) // 重新测量宽度 function updateWidth() { getWidth() } </script> <style> .box { width: 300px; padding: 20px; border: 2px solid #42b983; margin: 10px 0; } </style> ``` #### 关键说明: 1. **`ref(null)` 声明** ```javascript const targetElement = ref(null) ``` - 创建与 DOM 关联的响应式引用 - 初始值必须设为 `null` 2. **模板绑定** ```html <div ref="targetElement">...</div> ``` - 元素渲染后 `targetElement.value` 自动指向 DOM 节点 3. **生命周期访问** ```javascript onMounted(() => { if (targetElement.value) { width.value = targetElement.value.offsetWidth } }) ``` - **必须在 `onMounted` 或之后访问**,因为 DOM 在挂载前不存在 - 使用 `offsetWidth` 获取**布局宽度**(包含内边距和边框) 4. **响应式更新** ```javascript function updateWidth() { // 在窗口调整大小时可调用 width.value = targetElement.value.offsetWidth } ``` - 需要动态响应窗口变化时,可监听 `resize` 事件 #### 注意事项: 1. **`onMounted` 是必需的** - 在 `setup` 中直接访问 `targetElement.value` 会得到 `null`,因为 DOM 尚未渲染 2. **宽度获取方式对比** | 方法 | 特性 | 是否包含内边距/边框 | |------|------|-------------------| | `element.offsetWidth` | 布局宽度 | ✓ | | `getComputedStyle(element).width` | 计算样式宽度 | ✗ | 3. **响应式更新场景** - 当元素尺寸可能变化时(如窗口缩放),建议添加: ```javascript window.addEventListener(&#39;resize&#39;, getWidth) onUnmounted(() => window.removeEventListener(&#39;resize&#39;, getWidth)) ``` 4. **组件内元素** - 如果目标元素在子组件中,需使用 `defineExpose` 暴露元素 #### 常见问题解决: - **获取值为 0** → 检查是否在 `onMounted` 内访问 - **动态元素宽度** → 结合 `watchEffect` 自动更新: ```javascript watchEffect(() => { if (targetElement.value) { width.value = targetElement.value.offsetWidth } }, { flush: &#39;post&#39; }) // 确保在 DOM 更新后执行 ``` [^1]: Vue3 中通过 ref 获取 DOM 节点的基本方法 [^2]: 获取 DOM 后操作样式的相关实践
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值