vue回车聚焦下一个input,动态绑定ref出现,refs拿到为undefined
问题
vue回车聚焦下一个input,动态绑定ref出现,refs拿到为undefined
由大模型辅助整理,保留原意,优化结构与可读性。
问题概述
提问者在 Vue 中动态绑定 ref,希望实现「回车后聚焦到下一个 input」的效果,但通过 this.$refs 访问对应的 ref 时得到的是 undefined,怀疑是访问 $refs 的写法有问题。
涉及技术
Vue、$refs、动态 ref
期望结果
希望明确几种访问 $refs 的写法之间的区别,并找出为什么动态绑定的 ref 取不到对应的实例。
回答
原始回答
2020-12-07 _this.$refs.label.foucs()_this.$refs[label].focus()_this.$refs['label'].focus()上述三个有什么不同?既然懂了,那么很明显,你读取的并不是你想要的
AI 优化 · 回答整理
解答思路
问题的关键在于区分清楚访问 $refs 时到底用的是「字面量属性名」还是「变量值作为属性名」,这三种写法在 JS 语法层面含义完全不同,只有正确地把变量作为动态键去访问,才能取到通过动态 ref 绑定注册的实例。
示例代码
this.$refs.label.focus(); // 访问名为字面量 "label" 的 ref
this.$refs[label].focus(); // 访问「变量 label 的值」所对应的 ref(正确的动态访问方式)
this.$refs['label'].focus(); // 等价于 this.$refs.label,同样是字面量 "label"
详细说明
这三种写法的本质区别:
this.$refs.label与this.$refs['label']是完全等价的,二者访问的都是名字字面量为"label"的那个 ref,与作用域中是否存在一个叫label的变量无关。this.$refs[label](注意没有引号)访问的是变量label当前的值所对应的属性名。如果动态绑定ref时用的是:ref="someDynamicName",那么真正注册到$refs上的键名是someDynamicName这个变量在运行时的实际取值,而不是字符串"label"。
回到问题本身:如果 ref 是通过 :ref="item.id" 之类的表达式动态生成的,那么访问时也必须用同样的动态取值方式(如 this.$refs[item.id]),而不能用 this.$refs.label 或 this.$refs['label'] 这种访问字面量固定字符串 "label" 的写法——这正是「读取的并不是你真正想要的那个 ref」,从而拿到 undefined 的根本原因。
小结
$refs.xxx 和 $refs['xxx'] 访问的是字面量字符串 "xxx",而 $refs[变量] 才是访问「变量的值」对应的动态键;动态绑定的 ref 必须用与绑定时一致的动态取值方式来访问,否则会因为键名不匹配而取到 undefined。
由大模型辅助整理,保留原意,补充结构与代码格式。
回答转载自 SegmentFault