当前位置: 首页 > 知识库问答 >
问题:

vue.js - Vue ref 属性在不同环境下的行为差异?

裴威
2023-12-20
<span :="refApi">区域</span><span ref="ref1">位置</span><span :="{ ref: 'ref2' }">操作</span>const ref1 = ref();const ref2 = ref();const ref3 = ref();const refApi = {  ref: 'ref3'};console.log(ref1, ref2, ref3);

在开发环境下 ref1, ref2, ref3 皆符合预期指向 span
但是打包后的生产环境就只有 ref1 正常指向 span , ref2, ref3 皆为 undefined
为什么表现不一致?

共有2个答案

端木令
2023-12-20

从问题和不同编译环境差异两个角度回答

问题

按我的印象中,不论是 v-bind 还是其缩写 : 都需要对应一个属性吧(还是最新的版本发生了变化?)

如果题主是期望实现动态属性,那也应该这么做:

<span :[key]="refApi"></span>

而不是

<span :="refApi"></span>

而且根据官方文档的描述,ref 理论取值就只有 string | Function

所以理论正确的写法应该是

<template>    <span :ref="refApi">区域</span>    <span ref="ref1">位置</span></template><script>import { ref, onMounted } from 'vue'const ref1 = ref();const ref2 = ref();const refApi = (e) => {  ref2.value = e};// 针对 ref 的操作建议在挂载后访问onMounted(() => {  console.log(ref1.value, ref2.value);})</script>

不同编译环境的差异

至于为什么会出现开发环境能够正常捕获到,但是生产环境失败,个人认为是生产环境下,脚手架或编译工具进行了优化导致的,具体原因恐怕得发个 issue 问官方团队了(如果后续有蹲到具体的产生原因,也可以 @ 我一下)

总之,上方的写法是符合规范的,能够保证编译后在生产环境也正常运行

参考

vue官方文档中关于ref属性的描述
vue官方discord (discord看运气,偶尔不挂梯也能访问)
vue github discussions
vue github issue
暴阳州
2023-12-20

在 Vue 3 中,ref 是一个函数,它返回一个响应式引用。这个引用的值是你在调用 ref 函数时传入的参数。在你的代码中,ref1ref2ref3 都被初始化为对 span 元素的引用。

但是,当你尝试将 ref 作为一个对象的属性时(如 refApi),情况就有些不同了。在这种情况下,refApi.ref 是一个字符串,而不是一个对 span 元素的引用。因此,当你尝试访问 refApi.ref 时,你实际上得到的是一个字符串,而不是一个对 span 元素的引用。

所以,当你试图打印 ref1ref2ref3 时,你实际上是在打印对 span 元素的引用。在开发环境中,这些引用是有效的,因为你的代码正在运行时,这些元素是存在的。但在生产环境中,由于代码已经被打包和优化,这些引用可能已经失效了,因为元素可能已经被移除或更改了。

这就是为什么在生产环境中,你只能看到 ref1 是有效的,而 ref2ref3 都是 undefined 的原因。

 类似资料:
  • 我有一个Selenium测试,它是在Spock框架的帮助下执行的。一般来说,它是这样的: null

  • 问题内容: 我目前在“开发”框中安装了Jenkins实例。这样可以很好地构建并且可以毫无问题地部署到我们的开发环境中。 在构建过程中,我的项目使用了一个包含诸如数据库连接URL之类的详细信息的属性文件(诸如此类的详细信息显然会因我所指向的环境而异)。 我想知道的是配置项目的最佳方法是什么,以便当我想将Jenkins构建的WAR文件发布到Production中时,它包含Production属性而不是

  • 我正在使用带有JPA的Spring Boot与数据库连接。我需要在实体上的@table注释中设置“catalog”属性。 有没有人知道其他的方法,比如application.properties文件,而不是硬编码的字符串,来改变它? 如果有任何解决办法,我将不胜感激。

  • 当我尝试获取字符串tempdir=System时。getProperty(“java.io.tmpdir”);它将返回我的操作系统“temp”目录路径。e、 普通java应用程序中的g.C:\Users\DATAGU~1\AppData\Local\Temp\。这是正确的。 但是,当我尝试在部署在tomcat6上的web应用程序上获取相同的属性时,它会返回tomcat temp目录路径(例如D:\

  • 我正在使用一个具有不同测试环境(test、QA、UAT、PROD)Spring boot应用程序的关键云代工,我创建了多个属性文件(每个指向不同的数据库),如 或者,当我转移到更高的环境时,我需要改变吗? 提前道谢。

  • A Zen student went up to a hot dog vendor and said: "Make me one with everything". — Joke 环境背景很重要。 如果你想对 Puppet 的配置清单在应用到生产环境之前先进行测试, 你可以使用 Puppet 的 environment 特性来做到。 这可以让你根据环境应用不同的配置清单来设置客户机。例如,你可以定