没有什么可以阻止您在应用程序中使用DOM1
和接收器。DOM2
bloodyKnuckles 的例子完美地说明了https://esnextb.in/?gist=b54baa4131974b7f12d190fb63be8aeb
话虽如此,我不确定我是否真的明白这样做的意义。如果是性能问题,我认为将应用程序的渲染拆分为两个 DOMDriver 不会有太大收获。虚拟 DOM 库(在循环的情况下为 snabbdom)被定制为识别没有改变的 DOM 片段,这些片段具有并且仅更新后者。
如果是责任问题(这 2 块 DOM 有非常不同的目的),那么我宁愿创建两个不同的循环应用程序,它们都在 DOM 的不同部分呈现。(然后run
在你的主文件中调用两次)
function app1(sources) {
return {
DOM: xs.of(div("hello from app1"))
}
}
function app2(sources) {
return {
DOM: xs.of(div("hello from app2"))
}
}
run(app1, {
DOM: makeDOMDriver("#app1")
})
run(app2, {
DOM: makeDOMDriver("#app2")
})
这样,您就可以清楚地分离两个应用程序的关注点。
现在回答您关于为什么需要将一段虚拟 DOM 包装在div
. 这是因为一块虚拟 DOM 必须有一个根元素。换句话说:一块虚拟 DOM 必须是独立的(就像 HTML 文档只有一个<html>
元素,即根)。实际上,这是一个很好的约束,因为它迫使您拥有独立的组件。在您给出的示例中(带有<input>
字段),返回这样的 vDOM 绝对没有问题:
DOM: xs.of(input(/*...*/))
但是如果你的组件有 aninput
和 a label
,那么你需要将它包装在另一个 vNode 中
DOM: xs.of(div([label(/*...*/), input(/*...*/)])