vue.js - 访问 Vuejs 组件中的 DOM 元素不可靠
问题描述
在下面的简化示例中,我演示了我的问题:
- 我有一个异步更新的 for 循环
myItems
。 - 我希望能够
selectableItems
通过使用this.$el.querySelector('selectable-item')
.
<template>
<div>
<p>selectableItems: {{selectableItems}}</p>
<div v-for="item in myItems" class="selectable-item">item</div>
</div>
</template>
<script>
export default {
name: 'MyComponent',
data() {
return {
myItems: [],
selectableItems: [],
}
},
created(){
// Populate myItems with a delay
self = this
setTimeout(function() {
self.myItems = [1, 2, 3]
}, 1000);
},
mounted(){
// Fetch some of myItems based on a class
this.selectableItems = this.$el.querySelectorAll('.selectable-item')
},
}
</script>
<style scoped lang="scss">
</style>
我尝试了很多我在网上找到的不同的东西;TickNext,计算,更新等。我认为我在做一些根本错误的事情。但是对于我的案例来说,能够按类选择 DOM 元素很重要。
任何帮助都深表感谢。
更新:更多上下文
有些人要求我提供更大的图景,所以我在这里提供更多信息。
目前我有一个很大的 Vue 组件,用户可以在其中选择元素。我试图将所有这些用户交互分解到一个 mixin 中,这样我就可以在我的代码的其他地方重用它。
为了使可重用性变得容易,我需要能够并且简单地selectable
向模板中的任何 HTML 标记添加一个类。这就是界面,然后 mixin 会selectedElements
根据用户交互执行所有魔法并填充。
这就是为什么避免 refs 等很重要的原因,因为那时太多的逻辑泄漏无处不在,超出了使 mixin 可重用的目的。除非我错过了什么。
解决方案
好的,在尝试了许多不同的事情之后,我设法通过使用非反应性中间变量来解决这个问题。这意味着我不能在模板中使用该变量,但这很好。
export default {
..
// NOT reactive so you can't just use it in your templates.
_selectableItems: [],
updated(){
self._selectableItems = self.$el.querySelectorAll('.selectable-item')
},
..
}
推荐阅读
- javascript - JS 正则表达式从文本中提取所有 URL 到 URL 数组
- redis - Redis PubSub Lettuce:如何处理背压?
- javascript - 如何停止繁忙的javascript程序?
- java - 如何在 Apache Calcite 中格式化日期字段?
- android - startActivityForResult 应仅在暗模式下使用错误
- android - 通过意图在android 10中安装apk时出现异常(android.content.ActivityNotFoundException)
- java - 如何为多种对象(Java)编写具有相同实现的方法?
- marklogic - 我在处理 ZIP 时收到 500 个内部服务器错误 (XDMP-CHILDNODEKIND)
- python - 即使使用 O_EXCL,打开的文件也太多
- c# - 使用管理员权限执行安装程序