Использование пакета React и npm «react-d3-дерево» — Ожидаете, что представление дерева будет обновляться при изменении базовых данных, но этого не происходит?

#javascript #reactjs #d3.js

Вопрос:

Я создаю карту хранилища, используя React и «react-d3-дерево». Это должно помочь мне управлять всеми инструментами и запасными частями на моей лодке.

Я мало что знаю о D3, так что на данном этапе это просто доказательство концепции. Я должен уметь управлять деревом, добавляя и удаляя узлы во время отображения графика. Я ожидал, что график будет отображаться повторно при изменении данных, но этого не происходит. Я не могу найти ни подтверждения, ни опровержения в документации пакета, поэтому я подумал, что задаю вопрос здесь.

Я вложу соответствующие файлы, но в основном я отображаю начальное дерево, хранящееся в файле, затем в onNodeClick функции я добавляю дочерний узел, и на графике ничего не происходит, т. е. Изменение не отражается. Журналы подтверждают, что узел добавлен правильно, но визуального подтверждения нет. Вот файлы…

InitialTree.js

 export const InitialTree = {
  name: 'Storage Map',
  children: [
    {
      name: 'Engine Room',
      children: [
        {
          name: 'portside',
          attributes: {
            1: 'oil filter',
            2: 'v-belt',
          },
        },
        {
          name: 'starboard',
          attributes: {
            1: 'various hoses',
            2: 'grinder discs',
          },
        },
      ],
    },
    {
      name: 'Saloon',
      children: [
        {
          name: 'Desk',
          children: [
            {
              name: 'Left Drawer',
              attributes: {
                1: 'electronics',
                2: 'hard discs',
              },
            },
            {
              name: 'Right Drawer',
              attributes: {
                1: 'electrics',
                2: 'fuses',
              },
            },
            {
              name: 'Hidden Drawer',
              attributes: {
                1: 'ship documents',
                2: 'personal documents',
              },
            },
          ],
        },
        {
          name: 'Foreman1',
          attributes: {
            department: 'Assembly',
          },
          children: [
            {
              name: 'Worker1',
            },
            {
              name: 'Worker2',
            },
            {
              name: 'Worker3',
            },
          ],
        },
      ],
    },
  ],
}

export default InitialTree
 

App.js

 import React, { useState } from 'react'
import ShowTree from './components/ShowTree'
import InitialTree from './components/InitialTree'
import './App.css'

export const App = () => {
  const [store, setStore] = useState(
    InitialTree || { name: 'Storage Map', children: [] }
  )

  const processHandleNodeClick = async (node) => {
    if (node.__rd3t.collapsed === false) {
      const newStore = store
      const newChild = { name: 'Lazarette', children: ['A Shelf', 'A Rack'] }
      newStore.children.push(newChild)
      console.log('newStore', newStore)
      await setStore(() => newStore)
      console.log('store', store)
    }
  }
  return (
    <div className="App">
      <ShowTree store={store} processHandleNodeClick={processHandleNodeClick} />
    </div>
  )
}

export default App
 

ShowTree.js

 import React, { useState } from 'react'
import Tree from 'react-d3-tree'
import '../App.css'

export const ShowTree = (props) => {
  console.log('props', props)

  const [orientation, setOrientation] = useState('vertical')

  const handleNodeClick = (node) => {
    console.log('clicked', node)
    props.processHandleNodeClick(node)
  }

  const handleLinkClick = (link) => {
    console.log('clicked', link)
    setOrientation(() =>
      orientation === 'vertical' ? 'horizontal' : 'vertical'
    )
  }

  return (
    <div id="treeWrapper" style={{ width: '80em', height: '50em' }}>
      <Tree
        data={props.store}
        depthFactor="100"
        collapsible={true}
        initialDepth="5"
        nodeSize={{ x: 20, y: 20 }}
        orientation={orientation}
        pathFunc="diagonal" // diagonal, straight, elbow, step
        separation={{ nonSiblings: 15, siblings: 15 }}
        zoomable={true}
        zoom="0.5"
        onNodeClick={handleNodeClick}
        onLinkClick={handleLinkClick}
      />
    </div>
  )
}

export default ShowTree
 

I know this is not the most popular package in npm but maybe someone knows the answer or can recommend an equivalent but working solution.
Btw the onLinkClick option is not working either, ie the links between the nodes are not clickable contrary to what the documentation says, but this is a minor issue for me.
Thanks for your help.