Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Как правильно обновить данные в d3? (https://javascript.ru/forum/dom-window/79504-kak-pravilno-obnovit-dannye-v-d3.html)

gsdev99 17.02.2020 15:44

Как правильно обновить данные в d3?
 
Всем привет. Подскажите, пожалуйста, как правильно решить следующую задачу. У меня есть график, по оси y при перерендере приходит точка, по которой я отрисовываю оранжевую горизонтальную линию. Сейчас проблема в следующем при изменении состояния у меня не перерисовывается линия, а как бы запоминается предыдущее состояния и дорисовывается. Если нажать на button3, а затем на button2, данный баг виден. Перерисовка реализуется в компоненте Axis. Буду благодарен вашей помощи.
https://codepen.io/gsdev99/pen/dyoMQmZ
Фактически ошибка в этом компоненте:
const Axis = ({ scale, orient, transform, width, tickSelected }) => {
  
    const ref = useRef(null)

    const renderAxis = () => {
        let axis = null

        if (orient === 'bottom') {
            axis = d3.axisBottom(scale)
        }

        if (orient === 'left') {
            axis = d3.axisLeft(scale)
        }

        d3.select(ref.current).call(axis)
    }

    const updateAxis = () => {

        if (orient === 'left') {
          
          if (!tickSelected) {
              
          }
          
          console.log('tickSelected', tickSelected)
          
            const axis = d3
                .axisLeft(scale)
                .tickSize(-width)

            const g = d3.selectAll(`.${orient}`)
                .call(axis)
            
            g
                .selectAll('.tick line')
                .filter((d) => {
                    if (d === tickSelected) {
                        return d === tickSelected
                    }

                    if (d === tickSelected) {
                        return d === tickSelected
                    }

                    return null
                })
                .attr('class', 'is-active')
        }

        if (orient === 'bottom') {
          
            const axis = d3
                .axisBottom(scale)
                .ticks(2)
             
            d3.select(ref.current)
                .call(axis)
        }
    }

    useEffect(() => {
        renderAxis()
    }, [])


    useEffect(() => {
        updateAxis()
    })

    return (
        <g
            ref={ref}
            transform={transform}
            className={`${orient} axis`}
        />
    )
}


Часовой пояс GMT +3, время: 20:27.