Я хочу удалить старый SVG и создать новый SVG при каждом изменении значения chart_data.
import React, {useRef, useEffect, useState} from 'react'
import * as d3 from 'd3'
import { useSelector} from "react-redux";
const Barchart = () =>{
const chart = useRef(null);
const chart_data= useSelector(state => state.ChartReducer);
useEffect(() => {
let svg = d3.select(chart.current)
//code to create the chart
//
return () => {
//How to remove the old svg element from the ref chart.current?
//I tried
chart.current.removeChild() // This throws an error saying expects 1 argument got 0
}
},[chart_data])
return(
<div className = "bar-chart" ref = {chart}></div>
)
}
export default Barchart
chart.current.removeChild()
не удаляет детей <div className = "bar-chart" ref = {chart}></div>
Как удалить все дочерние элементы div со ссылкой на useRef?
Node.removeChild() требует аргумент узла (удаляемый дочерний узел), который вам не хватает.
В этой проблеме нет ничего специфичного для React.
Возможно, вы имели в виду
chart.current.removeChild(svg)
?
Вы должны указать дочерний элемент в методе removeChild()
.
chart.current.removeChild(chart.current.children[0])
вы должны перебирать chart.current.children и выполнять removeChild() каждый.
Если вы хотите удалить все дочерние элементы, вы можете установить свойство innerHTML, chart.current.innerHTML = ""
chart.current.innerHTML = "";
Предупреждение: innerHTML удаляет все дочерние узлы узла, однако это не рекомендуется делать, поскольку не удаляются обработчики событий дочерних узлов, что может вызвать утечку памяти.
@jfunk Я думаю, что он удалит обработчики событий, если вы попытаетесь отредактировать узел с помощью innerHTML, что-то вроде этого node.innerHTML +='<br/>' вызовет утечку памяти, потому что он удаляет обработчики событий, но этот node.innerHTML = "" безопасен, пожалуйста, поделитесь со мной какой-либо ссылкой.
кажется, вы правы, независимо от того, как элементы удаляются из DOM, если обработчики событий не удаляются до удаления, существует риск утечки памяти — вот мой первоисточник, htmldom.dev/remove-all -дети-узла
Я использовал приведенный выше ответ, т.е. вы должны указать дочерний элемент в методе removeChild(). Но он выдает ошибку, и я обрабатываю ее следующим образом:
if (chart.current.children[0]) {
chart.current.removeChild(chart.current.children[0]);
}
Таким образом, он проверяет дочерний элемент, если он присутствует, а затем удаляет его.
Это работает. Но что, если я хочу удалить все дочерние элементы?