【发布时间】:2019-12-20 20:13:22
【问题描述】:
我以前使用过 Vue,我知道如何使用 v-for 来渲染一系列元素,v-if 或 v-show 有条件地显示元素,以及 v-model 来控制例如段落的内容.
但现在我需要更好地控制 DOM:
- 我的组件的
data中有一个ranges对象,并且我的模板中有一个textdiv(text可能是一个id 和/或ref 属性)。 - 对于每个范围,我想突出显示
textdiv 内的特定文本部分,而不是基于字符串或正则表达式匹配,而是基于文本索引(我之前使用 Rangy 进行过此操作)。 - 我还想在每个范围内插入一些工具提示或弹出框,例如 v-tooltip [可选]。
例如,当我的范围对象包含{ start: 0, end: 3 } 时,我想突出显示<div ref='text'>The cat chases a dog.</div>inside 中的。
在这种情况下,操作 DOM 对我不起作用,因为 (i) 将更新 data 导致 Vue 再次更新 DOM,删除以前的编辑和 (ii) 随后插入的元素类似于 document.createElement('my-component'); Vue 甚至不将其识别为组件。
有什么方法可以利用 Vue 的数据驱动方法来做我需要的事情吗?
【问题讨论】:
-
我没有使用 Vue 的原生引擎创建文本高亮的经验,但是可以在某个生命周期挂钩下重新执行非 Vue 相关的算法。只需在
updated()之类的东西中运行您的突出显示方法,确保将其包装在this.$nextTick(func)中。这样做后,即使 Vue 在组件更改其状态时替换了所有手动 DOM 更新,您也可以重新应用手动 DOM 更新。 -
除非你的组件经常更新(也许它是一个间隔更新的组件)并且你的手动 DOM 更新非常繁重,否则你不应该有性能问题。
标签: javascript vue.js dom vuejs2