我用 scalajs-react 构建了一个简单的 TreeView。每个节点都包含一个文本字段。
我在 child 中写了一些文字1.1
:
现在,如果我在1.2
下面添加新1
的子节点,文本就会消失,因为节点1
及其所有子节点都被重新渲染:
在此 Javascript-Redux TreeView中添加子项时,不会重新渲染兄弟姐妹。如何使用 scalajs-react 实现这一目标?
请参阅下面的代码或GitHub 上的最小示例项目。
case class Node(text: String, children: Vector[Node])
object TreeView {
val childNode = Node("1.1", Vector())
val parentNode = Node("1", Vector(childNode))
val rootNode = ScalaComponent.builder[Unit]("Node")
.initialState(parentNode)
.renderBackend[NodeBackend].build
class NodeBackend($ : BackendScope[Unit, Node]) {
def addChild =
$.modState(
_.copy(children = $.state.runNow().children :+ Node("1.2", Vector())))
def render(node: Node): VdomElement = {
val children =
if (node.children.nonEmpty)
node.children.toVdomArray(child => {
val childNode = ScalaComponent.builder[Unit]("Node")
.initialState(child)
.renderBackend[NodeBackend].build
childNode.withKey(child.text)()
})
else EmptyVdom
<.div(
node.text, <.input(), <.button("Add child", ^.onClick --> addChild),
children
)
}
}
def apply() = rootNode()