ref模板引用必须要在组件实例挂载完成之后才可以访问。如果你是在组合式 API 里面写的组件,那么 setup 函数比任何周期函数都早,所以不可能在该函数中执行时获取得到ref——组件实例。

官网关于ref获取组件实例有两个案例:onMounted、watchEffect 中获取 ref。其中 onMounted有的说:

如果此时在setup函数里写了一个异步函数,毫无疑问,该异步任务不影响组件执行周期函数,也就是说onMounted确实能获取得到模板引用。但如果模板中某个节点是要获取了数据之后才更新 DOM,假如我需要的正是这个 DOM 的高度呢?有可能是 0,因为数据是异步的,而周期函数执行时间一般都快于异步函数的执行。

// setup

const todolist = ref(null);
const data = ref(await getData()); onMounted(() => {
todolist.value; // => null
});
<div ref="todolist">
<ul v-for="item in data">
<li>{{ item }}</li>
</ul>
</div>

针对于异步数据,onMounted不行,那watchEffect行不行呢?答案是当然可以,但是watchEffect不管有没有等到 DOM 异步之后更新,都要执行,也就是它第一次可能是获取 null 值,所以也不合适。

const count = ref(0)

watchEffect(() => console.log(count.value))
// -> 输出 0,首先是立即执行,此时已经追踪其依赖,假如发生改变,该函数重新执行。 count.value++
// -> 输出 1,改变响应式数据,重新执行 watchEffect 回调。

最好的是使用watch,监听ref发生的变化,因为 DOM 更新,模板引用也会更新,但不会像watchEffect那样,有可能第一次会得到一个 null 值:

// setup

const todolist = ref(null);
const data = ref(await getData()); watch(todolist, () => {
todolist.value;
});

Vue3 ref 模板引用获取不到节点的更多相关文章

  1. Vue3 组合式 API 中获取 DOM 节点的问题

    模板引用 Vue 提供了许多指令让我们可以直接操作组件的模板.但是在某些情况下,我们仍然需要访问底层 DOM 元素.在模板中添加一个特殊的属性ref就可以得到该元素. 访问模板引用 <scrip ...

  2. # vue3 ref 和 reactive 函数

    vue3 ref 和 reactive 函数 前言 上一篇博文介绍 setup 函数的时候,最后出现一个问题,就是在 setup 函数中,编写一个事件,直接去修改定义的变量,发现页面上没有更新成功,并 ...

  3. SVG.js 引用获取整理

    一.SVG.get() 根据id获取元素 var draw = SVG('svg1').size(300, 300); var circle = draw.circle(50); circle.fil ...

  4. Vue使用Ref跨层级获取组件实例

    目录 Vue使用Ref跨层级获取组件实例 示例介绍 文档目录结构 安装vue-ref 根组件自定义方法[使用provide和inject] 分别说明各个页面 结果 Vue使用Ref跨层级获取组件实例 ...

  5. 获取$(this)子节点对象的方法

    获取$(this)子节点对象的方法: 1.children()方法: children() 方法返回被选元素的所有直接子元素. 该方法只会向下一级对 DOM 树进行遍历. 2.find()方法: fi ...

  6. Thymeleaf+SpringMVC,如何从模板中获取数据

    Thymeleaf+SpringMVC,如何从模板中获取数据 在一个典型的SpringMVC应用中,带@Controller注解的类负责准备数据模型Map的数据和选择一个视图进行渲染.这个模型Map对 ...

  7. JavaScript获取HTML DOM节点元素详解(转)

    在Web运用程序特别是Web 2.0程序开发中,经常要获取页面中某个元素,然后更新该元素的样式.内容等.如何获取要更新的元素,是首先要处理的疑问. 51CTO推荐阅读:JavaScript DOM文档 ...

  8. Mvc Model 模板的获取【学习笔记】

    MVC的Model模板有两种:一种编辑模式(@Html.EditorFor()).一种显示模式(Html.DisplayFor()). 模板的获取与执行(以下转自这里): 当我们调用HtmlHelpe ...

  9. js jquery 获取元素(父节点,子节点,兄弟节点),元素筛选

    转载:https://www.cnblogs.com/ooo0/p/6278102.html js jquery 获取元素(父节点,子节点,兄弟节点) 一,js 获取元素(父节点,子节点,兄弟节点) ...

  10. jquery只获取自身文本节点,不获取子元素的

    jQuery.text()方法时候,会把子元素的文本也获取到,以下方法可获取自身文本节点,不包括子元素 <div id="demo">只获取我<a href=&q ...

随机推荐

  1. Jmeter之非GUI下执行脚本

    1.进入jmeter 应用所在路径 eg: cd D:\Program Files\apache-jmeter-5.2\bin 2.输入运行命令:jmeter -n -t [jmx脚本路径] -l [ ...

  2. 精华推荐 |【深入浅出Sentinel原理及实战】「原理探索专题」完整剖析Alibaba微服务架构体系之轻量级高可用流量控制组件Sentinel(1)

    Sentinel是什么?不要概念混淆啊! 注意:本Sentinel与Redis服务Sentinel是两回事,压根不是一个概念,请大家不要混肴. Alibaba的Sentinel Sentinel是由阿 ...

  3. python从公众号文章中获取二维码

    在做一个公众号采集的项目中,客户有个要求,想把二维码的url保存到数据库中,如图. 原本以为要各种骚操作各种逆向才能获取得到,没想到竟然很简单. 第一步 观察二维码url的规范 https://mp. ...

  4. 01.Java面试都问啥?

    大家好,我是王有志.好久不见,不过这次没有休假,而是搞了个"大"工程,花了点时间自学Python,然后写了"玩具爬虫",爬某准网的面经数据,为来年的" ...

  5. [OpenCV实战]3 透明斗篷

    目录 1寻找和存储背景帧 2红色区域检测 3提取红色区域 4背景帧红布区域替换当前帧红布区域. 5工程代码 参考 弄出哈利波特电影里一样效果的透明斗篷.也就是一个视频里,将红布弄成透明.类似下面的效果 ...

  6. 实现简单的csv文件上传和bootstrap表格的下载

    一.写一个简单的页面并发送文件 引入bootstrap.js,jQuery.js等,具体的网页就不细写了,很简单. 加入input框,button控件,进度条.如下: <li class=&qu ...

  7. 连号区间数【第四届蓝桥杯省赛C++B组,第四届蓝桥杯省赛JAVAB组】

    连号区间数 小明这些天一直在思考这样一个奇怪而有趣的问题: 在 \(1∼N\) 的某个排列中有多少个连号区间呢? 这里所说的连号区间的定义是: 如果区间 \([L,R]\) 里的所有元素(即此排列的第 ...

  8. lock 和 Monitor (转载)

    Lock和Monitor都是对被操作对象同步控制的方法 Lock 是 Monitor的简化版本,IL callvirt ...Monitor.Enter(object)...leave.s.... c ...

  9. 迷宫机器人最短路径使用tkinter绘制

    起因 我想要写一个玩家和机器对战的迷宫游戏.这个项目我没有写完,我实现了最短机器人路径并绘制在tkinter上,以及玩家移动的功能.更多的关于GUI的设计太花时间了我没有写完. 算法介绍 我在写机器人 ...

  10. vivo 超大规模消息中间件实践之路

    作者:vivo 互联网存储技术团队-Luo Mingbo.中间件团队- Liu Runyun 本文根据"2022 vivo开发者大会"现场演讲内容整理而成. 本文主要介绍超大数据规 ...