【问题标题】:Is there a way to store a reference to a specific component within the DOM?有没有办法在 DOM 中存储对特定组件的引用?
【发布时间】: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


    【解决方案1】:

    除了全局事件总线,您还可以使用状态管理,例如 Vuex。当您更改文件夹时,您只需发送一个操作。这使用command pattern,而不是提到的listener pattern。您也可以选择在asynchronoussynchronous 执行此操作。

    有几种方法可以从组件内部或外部注册您的侦听器/观察器。

    使用这种架构,您可以轻松添加撤消/重做功能,还可以在mutations 的历史记录中来回导航。

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

    事实上,Vuex 正是为这样的情况而构建的,当组件需要相互通信但父/子 prop/emit/inject 机制开始变得乏味并崩溃时。

    很有可能一旦你开始使用 Vuex,你就永远不会回头。

    【讨论】:

    • 谢谢!我实际上已经在使用 Vuex,但只是作为商店。我将研究如何充分利用 Vuex,因为它似乎可以做的不仅仅是处理一些简单的状态。
    猜你喜欢
    • 1970-01-01
    • 2022-11-02
    • 2021-01-12
    • 1970-01-01
    • 1970-01-01
    • 2023-02-25
    • 1970-01-01
    • 2017-11-10
    • 1970-01-01
    相关资源
    最近更新 更多