Как удалить дочерний элемент div в реакции с помощью хука useRef?

Я хочу удалить старый 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?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
0
13 792
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Node.removeChild() требует аргумент узла (удаляемый дочерний узел), который вам не хватает.

В этой проблеме нет ничего специфичного для React.

Возможно, вы имели в виду

chart.current.removeChild(svg)

?

Ответ принят как подходящий

Вы должны указать дочерний элемент в методе removeChild().

chart.current.removeChild(chart.current.children[0])

Это работает. Но что, если я хочу удалить все дочерние элементы?

Frank David 23.12.2020 14:43

вы должны перебирать chart.current.children и выполнять removeChild() каждый.

wangdev87 23.12.2020 14:44

Если вы хотите удалить все дочерние элементы, вы можете установить свойство innerHTML, chart.current.innerHTML = ""

lissettdm 23.12.2020 22:44

Node.removeChild() требует удаления дочернего узла в качестве аргумента. Если вы хотите удалить все дочерние элементы, вы можете использовать Element.innerHTML:

chart.current.innerHTML = "";

Предупреждение: innerHTML удаляет все дочерние узлы узла, однако это не рекомендуется делать, поскольку не удаляются обработчики событий дочерних узлов, что может вызвать утечку памяти.

jfunk 10.07.2021 05:56

@jfunk Я думаю, что он удалит обработчики событий, если вы попытаетесь отредактировать узел с помощью innerHTML, что-то вроде этого node.innerHTML +='<br/>' вызовет утечку памяти, потому что он удаляет обработчики событий, но этот node.innerHTML = "" безопасен, пожалуйста, поделитесь со мной какой-либо ссылкой.

lissettdm 12.07.2021 16:22

кажется, вы правы, независимо от того, как элементы удаляются из DOM, если обработчики событий не удаляются до удаления, существует риск утечки памяти — вот мой первоисточник, htmldom.dev/remove-all -дети-узла

jfunk 12.07.2021 18:46

Я использовал приведенный выше ответ, т.е. вы должны указать дочерний элемент в методе removeChild(). Но он выдает ошибку, и я обрабатываю ее следующим образом:

if (chart.current.children[0]) {
  chart.current.removeChild(chart.current.children[0]);
}

Таким образом, он проверяет дочерний элемент, если он присутствует, а затем удаляет его.

Другие вопросы по теме