为什么在 Vue 中使用 $refs 时有时需要 $el?
Why is $el sometimes necessary when using $refs in Vue?
我使用如下代码在按下 ENTER 键时触发 click 事件:
<q-tab-panel name="option1" @keyup.enter.native="$refs.button.click()">
...
<q-btn ref="button" @click="function()" />
...
</q-tab-panel>
标签属于 Quasar Framework 的组件。这段代码不久前还可以工作,但现在需要进行以下更改才能工作:
<q-tab-panel name="option1" @keyup.enter.native="$refs.button.$el.click()">
也就是说,现在使用引用 $refs.button.click()
会在按下 ENTER 时产生错误:
[Vue warn]: Error in v-on handler: "TypeError: Cannot read property 'defaultPrevented' of undefined"
为什么以前能用,为什么现在不能用了?我看到有人提到它与 Vue 的版本有关,或者在组件中使用引用而不是本机 DOM 元素。请参阅 . I have also seen ,它没有回答为什么之前有效而现在无效的原因。
Vue 文档对 $el
的描述如下:
The root DOM element that the Vue instance is managing.
这是有道理的,但也不能解释为什么以前不需要它。就我而言,错误发生在 Vue 2.6.10.
目前,$ref
return 是一个 Vue 组件的实例。 click()
是一种在 DOM 元素上调用的方法(尽管您可以向组件添加 click
方法)。要调用它,您需要实际的 DOM 元素,这就是 $el
的用途。 $el
return 给定 Vue 实例附加到的 DOM 节点。
话虽这么说,我对它为什么以前有效以及为什么不再有效的最佳猜测是,Vue 将此行为从一个版本更改为另一个版本,并且您在(如果)更改版本时注意到它.
造成这种差异的另一个可能原因是,在您之前的用例中,您可能在不是 Vue 组件的标签上使用了 refs,而是常见的 HTML 标签。在这种情况下,$ref
仍将是 return 一个 DOM 节点。
我使用如下代码在按下 ENTER 键时触发 click 事件:
<q-tab-panel name="option1" @keyup.enter.native="$refs.button.click()">
...
<q-btn ref="button" @click="function()" />
...
</q-tab-panel>
标签属于 Quasar Framework 的组件。这段代码不久前还可以工作,但现在需要进行以下更改才能工作:
<q-tab-panel name="option1" @keyup.enter.native="$refs.button.$el.click()">
也就是说,现在使用引用 $refs.button.click()
会在按下 ENTER 时产生错误:
[Vue warn]: Error in v-on handler: "TypeError: Cannot read property 'defaultPrevented' of undefined"
为什么以前能用,为什么现在不能用了?我看到有人提到它与 Vue 的版本有关,或者在组件中使用引用而不是本机 DOM 元素。请参阅
Vue 文档对 $el
的描述如下:
The root DOM element that the Vue instance is managing.
这是有道理的,但也不能解释为什么以前不需要它。就我而言,错误发生在 Vue 2.6.10.
目前,$ref
return 是一个 Vue 组件的实例。 click()
是一种在 DOM 元素上调用的方法(尽管您可以向组件添加 click
方法)。要调用它,您需要实际的 DOM 元素,这就是 $el
的用途。 $el
return 给定 Vue 实例附加到的 DOM 节点。
话虽这么说,我对它为什么以前有效以及为什么不再有效的最佳猜测是,Vue 将此行为从一个版本更改为另一个版本,并且您在(如果)更改版本时注意到它.
造成这种差异的另一个可能原因是,在您之前的用例中,您可能在不是 Vue 组件的标签上使用了 refs,而是常见的 HTML 标签。在这种情况下,$ref
仍将是 return 一个 DOM 节点。