Vue.js 有没有办法在DOM中存储对特定组件的引用?

Vue.js 有没有办法在DOM中存储对特定组件的引用?,vue.js,vuejs2,vue-component,Vue.js,Vuejs2,Vue Component,问题是: 我目前正在处理一个文件树,更具体地说是“选定文件夹”功能。我这样做是为了有一个创建新文件和文件夹的特定目标,而不是根文件夹。(我在Electron中使用Vue,但这与问题无关) 选择发生在单击时。由于文件树的性质,我使用递归组件(这限制了我对某些组件的“轻松”访问) 虽然在后端实现这一点并不重要,但我的确切问题是,当使用不同的背景色或粗体文本(通过在样式表上绑定具有相应样式的id或类)标记所选文件夹时,我需要取消标记先前选择的目录 那么,如何获得对间接(由于递归组件)子组件的访问权限

问题是:

我目前正在处理一个文件树,更具体地说是“选定文件夹”功能。我这样做是为了有一个创建新文件和文件夹的特定目标,而不是根文件夹。(我在Electron中使用Vue,但这与问题无关)

选择发生在单击时。由于文件树的性质,我使用递归组件(这限制了我对某些组件的“轻松”访问)

虽然在后端实现这一点并不重要,但我的确切问题是,当使用不同的背景色或粗体文本(通过在样式表上绑定具有相应样式的id或类)标记所选文件夹时,我需要取消标记先前选择的目录

那么,如何获得对间接(由于递归组件)子组件的访问权限

我所尝试和研究的:

现在,我知道在JS中不能在变量中存储指针或引用(否则,通过存储对前一个DOM元素的引用就可以很容易地实现这一点)

我有一些现成的解决方案,但它们确实很乏味,也不是很简单。以前,我必须根据文件系统更新重新呈现(通过重新读取)特定的子目录。通过从根目录传播子函数调用,直到到达需要重新渲染的目录,我实现了部分重新渲染。我必须这样做,因为FS watcher是在根组件上创建的

类似地,我可以通过联合国标记任务来完成这项工作。当我选择新文件夹时,我首先传播子函数调用,直到到达以前选择的文件夹,然后通过取消绑定样式id来取消标记它。在以前这样做过之后,我知道这不是一个令人愉快的方法

由于我可以获得click事件目标,我想知道是否可以以某种方式存储对以前“选定”的DOM元素的任何类型的引用,并在以后需要“取消选择”它时使用该引用

下面是我的文件夹组件的外观。我试着给这些属性命名,但如果有任何混淆,我会回答任何问题


我以前使用的传播方法是必要的,因为我只有一个事件文件系统路径,与我的Vue结构无关,因此我需要以某种方式转换遍历该路径。不过,在这里,一切都只在Vue环境中发生,所以我认为有某种方法可以轻松处理这一问题

编辑:嗯,就像我过去遇到的那样,仅仅在stackoverflow上写下问题本身就帮助我找到了解决方案

我在Vue项目上设置了一个全局事件总线,因此我可以在当前选定的文件夹上绑定一个事件侦听器。单击另一个文件夹(因此选中)后,它将在全局事件总线中发出一个事件,从而触发先前选中的文件夹。然后是事件侦听器的取消标记和解除绑定


不过,这只是一个解决方案,所以问题仍然存在。这是一个好的解决方案吗?这种方法有什么缺点吗?有更好的解决方案吗?

您也可以使用Vuex等状态管理,而不是全局事件总线。更改文件夹时,只需发送一个操作。这使用了
命令模式
,而不是前面提到的
侦听器模式
。您可以选择使此操作
异步
同步

有几种方法可以从组件内部或组件外部注册侦听器/监视器

使用此体系结构将允许您轻松添加撤消/重做功能,还可以在
突变的历史中来回导航

您还可以在浏览器中获得Vue工具提供的集成调试功能

事实上,Vuex正是针对这样的情况而构建的,组件之间需要相互通信,但父/子prop/发射/注入机制开始变得单调乏味并崩溃


一旦您开始使用Vuex,您很有可能再也不会回头了。

谢谢!我实际上已经在使用Vuex了,但只是作为一个商店。我将研究如何充分利用Vuex,因为它似乎可以做的远不止处理一些简单的状态。