でツリービューではない再レンダリング兄弟を行います。各ノードにはテキストフィールドがあります。は私が反応しscalajsでシンプルなツリービューを構築しましたscalajs反応し
は私が子供1.1
にいくつかのテキストを書き込む:そのすべての子を持つノード1
が再レンダリングされるので、私は1
の下に新しい子1.2
を追加した場合、今
、テキストが消える:
この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()
あなたの助けをありがとうございました! app.TreeView.NodeBackend.renderに:(app.Nodeノード)を養うために何を知ってはいけない:15: 残念ながら、私は 'TreeView.scalaを取得します。 [エラー] .renderBackend [NodeBackend] 'あなたのコードを実行しているとき。 – Tamriel
次のように私はあなたのStateSnapshotの例を理解する: すべてのコンポーネントがグローバルStateSnapshotオブジェクトへの参照を取得します。コンポーネントが新しい状態に設定すると、他のすべてのコンポーネントもその変更を取得します。 各変数にはグローバルなStateSnapshotが存在するため、変更が発生するとその変数を使用するコンポーネントのみが更新されます。 – Tamriel
私はStateSnapshotsでTreeViewを実装しようとしましたが、どのように子を扱うべきかわかりません。 'Traversal.fromTraverse [Vector、Node]'は役に立たないようです。私のデータがこの形式で来るので、 'Map [Id、Node]'という形式のグローバル状態オブジェクトを使いたいと思います。 – Tamriel