惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

MyScale Blog
MyScale Blog
量子位
宝玉的分享
宝玉的分享
爱范儿
爱范儿
云风的 BLOG
云风的 BLOG
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Recent Announcements
Recent Announcements
Apple Machine Learning Research
Apple Machine Learning Research
N
News and Events Feed by Topic
TaoSecurity Blog
TaoSecurity Blog
博客园 - 三生石上(FineUI控件)
小众软件
小众软件
Simon Willison's Weblog
Simon Willison's Weblog
Google DeepMind News
Google DeepMind News
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
aimingoo的专栏
aimingoo的专栏
Cloudbric
Cloudbric
Blog — PlanetScale
Blog — PlanetScale
Latest news
Latest news
S
Security @ Cisco Blogs
Last Week in AI
Last Week in AI
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Vercel News
Vercel News
W
WeLiveSecurity
M
MIT News - Artificial intelligence
P
Proofpoint News Feed
P
Proofpoint News Feed
P
Palo Alto Networks Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
T
The Blog of Author Tim Ferriss
腾讯CDC
大猫的无限游戏
大猫的无限游戏
Martin Fowler
Martin Fowler
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
V
V2EX
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Stack Overflow Blog
Stack Overflow Blog
IT之家
IT之家
有赞技术团队
有赞技术团队
Microsoft Security Blog
Microsoft Security Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
美团技术团队
博客园 - 【当耐特】
D
DataBreaches.Net
I
InfoQ
G
GRAHAM CLULEY
S
SegmentFault 最新的问题
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
B
Blog

博客园 - smil、梵音

C语言标准(C89/C90)中的32个关键字全列表 Windows 系统的 vscode 通过 Remote-SSH 连接虚拟机的 Ubuntu 系统运行 C 语言的代码 Windows 系统 vscode Remote-SSH 远程连接虚拟机里面的Ubuntu系统的失败处理 Ubuntu虚拟机里安装了SSH,开启SSH服务的时候报错 VS Code的Remote - SSH功能 Ubuntu系统里面安装 g++ ,sudo apt update 的含义 C语言是不是必须得通过gcc编译成可执行的程序? c语言用gcc编译过后,执行 ./hello.c 报错 ./hello.c: 权限不够 windows系统的虚拟机里面的Ubuntu系统安装VMware Tools Ubuntu的应用中心搜索 vscode 的时候,筛选条件为Snap包、debian包是什么意思,如何安装vscode Ubuntu系统是否就是Linux系统,安装软件和Windows系统有何区别 Ubuntu系统里面vscode运行C语言的第一个 Hello World 程序 vscode 中安装C/C++相关的插件 Ubuntu 安装一个轻量级的中文输入法Fcitx5 Ubuntu安装百度网盘 Ubuntu系统里面安装vscode 乌版图系统截屏快捷键 Ubuntu 系统里面运行C++ TortoiseGit 的安装与汉化 安装虚拟机+ ubuntu24.04 系统 联想小新安装 ubuntu24.04 双系统 | 安装乌版图系统 | windows安装 ubuntu24.04 双系统 利用faststone capture制作gif动图 Sublime Text 常用编辑快捷键速查表 vscode 中的 css 样式代码不显示折叠图标的解决方法 IDEA中git的Cherry-Pick的可视化使用(个人总结) IDEA中git的Cherry-Pick的使用 IDEA中如何实现git的cherry-pick可视化操作? Windows11添加系统环境变量 VS Code——Live Server的简介、安装与使用 vue3中 pinia 的运用 vscode使用region折叠任意想折叠的代码块 我本地分支代码推送到远程的另一个分支,怎么操作? idea中打开多文件编辑器换行展示 本地代码强制覆盖远程代码,本地代码强制和远程某一个分支保持一致,再覆盖远程代码 css头部固定,内容区域高度自适应剩余的屏幕高度,内容区域过多显示竖向滚动条 flex为1的元素宽度自适应的同时,文本太长的时候显示省略号 idea中项目文件目录消失如何解决 vue3插入图片 vue3使用构建工具时,关于本地图片的引用 vue3 中父组件调用子组件的方法,子组件是不是必须暴露方法 如何改变type="checkbox"的input复选框的样式 vue3中非父子组件、非祖先-后代组件之间传递方法 解决 IntelliJ IDEA 中项目右键没有 Git 菜单的问题 Git 合并时出现 Please enter a commit message to explain why this merge is necessary 问题解决 拉取远程其他分支的最新代码
关于 ref 为 DOM 元素或子组件实例动态创建引用的总结
smil、梵音 · 2025-03-19 · via 博客园 - smil、梵音

vue3中,元素动态绑定了ref,在循环生成的元素中,对 div 做了动态绑定。如下:

<div v-for="item in group" :key="item.id">
  <div :ref="(el) => setDeleteMenuRef(el, item.id)"></div>
</div>

然后定义方法

<script setup>
const deleteMenuRefs = ref(new Map()); // 存储所有菜单的 DOM 引用

// 动态绑定 ref 的方法
const setDeleteMenuRef = (el, id) => {
  if (el) {
    deleteMenuRefs.value.set(id, el);
  } else {
    deleteMenuRefs.value.delete(id);
  }
};
</script>

在 Vue 3 中,ref 是一个非常重要的概念,它用于为 DOM 元素或子组件实例创建一个引用,方便在代码中访问它们。下面我会详细讲解 ref 的用法,以及你提到的代码片段 :ref="(el) => setDeleteMenuRef(el, item.id)" 的含义。

1. ref 的基本用法

(1)绑定到 DOM 元素

在 Vue 3 中,ref 可以绑定到模板中的 DOM 元素上。例如:

<template>
  <div :ref="myDivRef">Hello, World!</div>
</template>

<script>
import { ref } from 'vue';

export default {
  setup() {
    const myDivRef = ref(null); // 定义一个 ref,初始值为 null

    // 在某个方法中访问这个 DOM 元素
    const handleClick = () => {
      console.log(myDivRef.value); // myDivRef.value 就是对应的 DOM 元素
    };

    return {
      myDivRef,
      handleClick,
    };
  },
};
</script>
  • myDivRef 是一个 ref,它的值是一个 DOM 元素。

  • 在模板中,通过 :ref="myDivRef"myDivRef 绑定到 <div> 元素上。

  • 当组件渲染完成后,myDivRef.value 就会指向这个 <div> 元素。

(2)绑定到子组件

ref 也可以绑定到子组件上,用于访问子组件的实例。例如:

<template>
  <ChildComponent :ref="childRef" />
</template>

<script>
import { ref } from 'vue';
import ChildComponent from './ChildComponent.vue';

export default {
  components: {
    ChildComponent,
  },
  setup() {
    const childRef = ref(null); // 定义一个 ref,初始值为 null

    // 在某个方法中访问子组件实例
    const handleChildMethod = () => {
      if (childRef.value) {
        childRef.value.someChildMethod(); // 调用子组件的方法
      }
    };

    return {
      childRef,
      handleChildMethod,
    };
  },
};
</script>
  • 在模板中,通过 :ref="childRef"childRef 绑定到子组件 <ChildComponent> 上。

  • 当组件渲染完成后,childRef.value 就会指向子组件的实例,可以通过它调用子组件的方法。

2. 动态绑定 ref(如 :ref="(el) => setDeleteMenuRef(el, item.id)"

在某些情况下,我们可能需要动态地为多个元素或组件绑定 ref,并且希望根据某些条件或数据来处理这些引用。Vue 3 支持通过函数的方式动态绑定 ref

(1)代码分析

<template>
  <div v-for="item in items" :key="item.id" :ref="(el) => setDeleteMenuRef(el, item.id)">
    {{ item.name }}
  </div>
</template>

<script>
import { ref } from 'vue';

export default {
  setup() {
    const items = ref([
      { id: 1, name: 'Item 1' },
      { id: 2, name: 'Item 2' },
      { id: 3, name: 'Item 3' },
    ]);

    // 定义一个对象来存储动态绑定的 ref
    const deleteMenuRefs = ref({});

    // 定义一个方法来设置动态绑定的 ref
    const setDeleteMenuRef = (el, id) => {
      if (el) {
        deleteMenuRefs.value[id] = el; // 将 DOM 元素存储到对象中,以 id 为键
      }
    };

    // 在某个方法中访问这些动态绑定的 ref
    const handleDelete = (id) => {
      const deleteMenuEl = deleteMenuRefs.value[id];
      if (deleteMenuEl) {
        console.log(deleteMenuEl); // 获取对应的 DOM 元素
        // 可以在这里执行删除菜单相关的操作
      }
    };

    return {
      items,
      deleteMenuRefs,
      setDeleteMenuRef,
      handleDelete,
    };
  },
};
</script>

(2)代码解释

  1. 动态绑定 ref 的方式

    • 在模板中,<div> 元素的 ref 属性绑定为一个函数 :ref="(el) => setDeleteMenuRef(el, item.id)"

    • 这个函数接收两个参数:

      • el:当前绑定的 DOM 元素。

      • item.id:当前循环项的 id

  2. 处理动态绑定的 ref

    • setup 函数中,定义了一个 deleteMenuRefs 对象,用于存储动态绑定的 ref

    • 定义了 setDeleteMenuRef 方法,当 DOM 元素被创建时,这个方法会被调用。

    • setDeleteMenuRef 方法中,将 DOM 元素 elid 为键存储到 deleteMenuRefs.value 对象中。

  3. 访问动态绑定的 ref

    • handleDelete 方法中,可以通过 deleteMenuRefs.value[id] 获取到对应 id 的 DOM 元素。

    • 这样就可以根据 id 动态地访问和操作对应的 DOM 元素。

(3)应用场景

这种动态绑定 ref 的方式非常适合以下场景:

  • 当你需要为多个动态生成的元素绑定 ref,并且希望根据某些标识(如 id)来区分和操作这些元素时。

  • 当你需要对一组元素进行统一的管理,例如批量操作、动态访问等。

3. 总结

  • ref 是 Vue 3 中用于为 DOM 元素或子组件实例创建引用的工具。

  • 可以通过 :ref="myRef" 的方式将 ref 绑定到 DOM 元素或子组件上。

  • 动态绑定 ref 的方式是通过函数 :ref="(el) => myFunction(el, otherParams)",可以在函数中处理 ref 的值,例如将其存储到一个对象中,方便后续根据条件访问。

  • 动态绑定 ref 的方式非常适合处理动态生成的元素集合,可以根据标识(如 id)来区分和操作这些元素。