我有一个 JavaScript 函数,它返回一个 DOM 节点,该节点表示一个树视图,其中有许多嵌套节点,我想知道是否可以将该函数传递给 vue 渲染函数?
我知道我不应该弄乱 DOM 或者改用递归模板,但是为了学习和挑战自己,我仍然想弄清楚......如何在 Vue 中操作 DOM,在帮助下的渲染函数。
谢谢你的帮助。
我有一个 JavaScript 函数,它返回一个 DOM 节点,该节点表示一个树视图,其中有许多嵌套节点,我想知道是否可以将该函数传递给 vue 渲染函数?
我知道我不应该弄乱 DOM 或者改用递归模板,但是为了学习和挑战自己,我仍然想弄清楚......如何在 Vue 中操作 DOM,在帮助下的渲染函数。
谢谢你的帮助。
我不知道有任何机制可以做到这一点(至少不是正式的)。渲染函数不是以任何方式操作 DOM 的地方。
您仍然可以在渲染函数之外小心地操作 DOM ,而不会过多地打扰 Vue。如果您<div>
的模板中有一个带有a 的空白占位符ref
,那么只要 DOM 元素保持在原位(v-if
在 div 上使用可能会干扰,但我不是 100% 确定这一点),将一个子元素附加到它应该没问题) . Vue 通常在重新渲染中重用相同的 DOM 元素方面做得很好——但这就是问题所在,你正在搞乱 Vue 认为它可以完全控制的 DOM,而且你不能保证 Vue 会与任何外部DOM 发生出乎意料的变化。
多想一下,您可以使用自定义 Vue 指令或组件来实现您想要的。像这样的东西:
Vue.directive('el', {
bind(el, binding) {
if (binding.value) {
el.appendChild(binding.value)
}
},
update(el, binding) {
// Check if bound element changed
if (binding.oldValue !== binding.newValue) {
if (binding.oldValue) {
// Remove old element
binding.oldValue.remove()
}
if (binding.value) {
// Append new element
el.appendChild(binding.value)
}
}
}
})
// Create a DOM element manually
const btn = document.createElement('button')
btn.textContent = 'Click'
new Vue({
el: '#app',
render(h) {
return h('div', {
directives: [
{
name: 'el',
value: btn
}
]
})
}
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app"></div>