• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

React aktualizacja DOM po usunięciu komponentu

Object Storage Arubacloud
0 głosów
718 wizyt
pytanie zadane 24 sierpnia 2018 w JavaScript przez Al3x Użytkownik (870 p.)

Witam.

Jestem w trakcie pisania własnej apki typu todo (wiem oklepany temat do bólu, ale całkiem przyjemnie się go pisze). Posiadam container który pobiera dane z serwera w componentDidMount, i następnie przekazuje je do state metodą setState. Na podstawie danych w state, container renderuje listę zadań. Każdy element posiada możliwość usuniecia, czyli wysłania polecenia Delete do serwera który usuwa dany element. Jednak dalej jest on widoczny na stronie do czasu odświeżenia. Teraz pytanie jak (najlepiej bez przeładowania strony) pozbyć sie tego elementu z widoku po usunięciu z bazy danych.

 

import React, { Component } from 'react';
import Todo from '../components/Todo/Todo';
import NewTodo from '../components/NewTodo/NewTodo';
import axios from 'axios';

class TodoPanel extends Component {

    state = {
        todos: [],
        todoToRemove: ""
    }

    componentDidMount () {
        if(this.state.todoToRemove === ""){
            axios.get("/api/todos")
            .then(todos => {
                console.log(todos);
                this.setState({todos: todos.data})
            });
        }
    }

    removeTodoHandler = (id) => {
        console.log(id);
        axios.delete('/api/todos/' + id)
            .then(response => {
                console.log(response);
            });
    }

    render() {

        return(
            <React.Fragment>
                {this.state.todos.map( (todo) => {
                        return(
                          <Todo 
                            title={todo.name}
                            key={todo._id}
                            indexValue={todo._id}
                            completed={todo.completed}
                            removed={() => this.removeTodoHandler(todo._id)}

                          /> 
                        );
                        
                })}

                <NewTodo />
            </React.Fragment>
        );
    }
}

export default TodoPanel;

 

1 odpowiedź

+1 głos
odpowiedź 25 sierpnia 2018 przez Kamil Łydka Stary wyjadacz (13,600 p.)
wybrane 25 sierpnia 2018 przez Al3x
 
Najlepsza

Twój komponent przede wszystkim się nie re-renderuje po użyciu funkcji removeTodoHandler. Warto, żebyś wiedział, że przede wszystkim zmiana wartości obiektu state powoduje ponowne wyrenderowanie komponentu. Z tego co widzę, to tylko usuwasz todo ze swojego api, a twój obiekt state pozostaje bez zmiany, więc masz parę rozwiązań. Możesz pójść na skróty i skorzystać z metody forceUpdate(), która pozwala wyrenderować komponent bez zmieniania obiektu state, ale to rozwiązanie chyba nie jest najlepsze. Możesz również pomyśleć nad użyciem setState() w jakiś sprytny sposób. Tym bardziej, że masz zrobioną specjalną wartość todoToRemove, której zbytnio nie używasz. Mam nadzieję, że udało mi się z grubsza przedstawić problem i rozumiesz gdzie to nie gra. Albo skorzystaj z forceUpdate(), ale nie jest to w sposób 'myślenia Reactowego', więc jeszcze lepiej odpowiednio pobaw się swoim stanem. 

1
komentarz 25 sierpnia 2018 przez Al3x Użytkownik (870 p.)
Jak najbardziej przedstawiłeś problem teraz już wiem co jest nie tak i w którym kierunku muszę działać. Dzięki wielkie.
1
komentarz 25 sierpnia 2018 przez Wiciorny Ekspert (269,710 p.)
forceUpdate() - nie polecam.

Możesz  też wykorzystać ponowne zapytanie do bazy danych uwzględniająć aktualizowane dane, więc na nowo wywołać update state- biorąć dane z bazy
komentarz 25 sierpnia 2018 przez Al3x Użytkownik (870 p.)
Ponowne zapytanie w funkcji removeTodoHandler()?
2
komentarz 25 sierpnia 2018 przez Kamil Łydka Stary wyjadacz (13,600 p.)
Każda funkcja powinna teoretycznie robić tylko jedną rzecz, ale zawsze możesz sobie w funkcji removeTodoHandler() wywołać funkcję, która już będzie pobierała nowe dane z bazy. :)
2
komentarz 26 sierpnia 2018 przez Wiciorny Ekspert (269,710 p.)
szacun że ktoś na SOLID zwrócił uwagę Single resposibility <3

Podobne pytania

0 głosów
1 odpowiedź 293 wizyt
0 głosów
1 odpowiedź 460 wizyt
pytanie zadane 23 października 2018 w JavaScript przez Bakr Mądrala (6,850 p.)
0 głosów
0 odpowiedzi 108 wizyt

92,555 zapytań

141,403 odpowiedzi

319,557 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...