【发布时间】:2019-04-26 22:41:08
【问题描述】:
问题:
我目前正在处理文件树,更具体地说是“选定文件夹”功能。我这样做是为了有一个特定的目标来创建新的文件和文件夹,而不是根文件夹。 (我在 Electron 中使用 Vue,但这与问题无关)
选择发生在点击。由于文件树的性质,我使用递归组件(这限制了我对某些组件的“轻松”访问)。
虽然在后端实现这一点很简单,但我的确切问题是,在使用不同的背景颜色或粗体文本标记所选文件夹时(通过绑定在我的样式表上具有相应样式的 id 或类) ,我需要取消标记之前选择的目录。
那么,我如何获得对间接(由于递归组件)子组件的访问权限?
我已经尝试过并调查过的内容:
现在,我知道在 JS 中你不能在变量中存储指针或引用(否则这很容易通过存储对前一个 DOM 元素的引用来实现)。
我有一些解决方案,但它们真的很乏味而且不是很简单。以前,我必须根据文件系统更新重新渲染(通过重新读取)特定的子目录。我通过从根目录传播子函数调用来实现部分重新渲染,直到到达需要重新渲染的目录。我必须这样做,因为 FS 观察程序是在根组件上创建的。
同样,我可以通过取消标记任务来做到这一点。当我选择新文件夹时,我首先传播子函数调用,直到到达先前选择的文件夹,然后通过取消绑定样式 ID 来取消标记它。之前做过这个,我知道这不是一个令人愉快的方法。
由于我可以获得点击事件目标,我想知道是否可以以某种方式存储对先前“选择”的 DOM 元素的任何类型的引用,并在以后需要“取消选择”它时使用该引用。
这是我的文件夹组件的样子。我尝试为属性提供不言自明的名称,但如果有任何混淆,我会回答任何问题。
<folder-comp
@openFile="openFile"
v-for="folder of folders"
:key="`folder-${folder.shortFolderName}`"
:folder-name="folder.shortFolderName"
:ref="folder.shortFolderName"
:full-folder-path="folder.fullFolderPath"
:local-directory="recursiveScanDir"
:indentation-level="indentationLevel + 1">
</folder-comp>
我之前使用的传播方法是必要的,因为我只有一个事件文件系统路径,与我的 Vue 结构无关,所以我需要以某种方式翻译遍历该路径。不过,这里的一切都只发生在 Vue 环境中,所以我想应该有某种方法可以轻松解决这个问题。
编辑:嗯,就像我过去发生的那样,只是在 stackoverflow 上写下问题本身就帮助我找到了解决方案。
我在我的 Vue 项目上设置了一个全局事件总线,所以我可以在当前选定的文件夹上绑定一个事件监听器。单击另一个文件夹(因此被选中)后,它会在全局事件总线中发出一个事件,触发先前选择的文件夹。随后是事件侦听器的取消标记和解除绑定。
虽然这只是一种解决方案,所以问题仍然存在。这是一个好的解决方案吗?这种方法有什么缺点吗?有没有更好的解决方案?
【问题讨论】:
标签: vue.js vuejs2 vue-component