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

React, key elementu w metodzie map, i metodyka pracy

Object Storage Arubacloud
0 głosów
276 wizyt
pytanie zadane 16 listopada 2021 w JavaScript przez Meksykanin Początkujący (250 p.)

Cześć, uczę się od jakiegoś czasu Reacta, i  przy pisaniu jednego z ćwiczeń naszła mnie refleksja co do poprawności zastosowanej przeze mnie praktyki. Czy mogę wyświetlając elementy z pomocą metody map używać dla atrybutu key właściwości przypisanej w sposób, w jaki zrobiłem to w przykładzie? I czy pracowanie ze stroną, w ten sposób (usuwanie elementu za pomocą element.remove(), a nie aktualizując state w komponencie klasowym) jest poprawne?

function List(props) {
    props.people.forEach((el, index) => props.people[index].id = index); //atrybut key dla react
    const handleRemove = (e) => { e.target.parentNode.remove() }
    return (
        <ul>
            {props.people.map((person) => <Person key={person.id} name={person.name} removal={handleRemove} />)}
        </ul>
    )
}

function Person({ name, removal }) {
    return (
        <li>
            {name}
            <button onClick={removal}>Usuń</button>
        </li>
    )
}

const people = [
    {
        name: "Marcel",
    },
    {
        name: "Igor"
    },
    {
        name: "Wiktor",
    },
    {
        name: "Dominik",
    },
    {
        name: "Bartosz",
    }];

ReactDOM.render(<List people={people} />, document.getElementById("root"));

 

1 odpowiedź

+2 głosów
odpowiedź 16 listopada 2021 przez ScriptyChris Mędrzec (190,190 p.)
props.people.forEach((el, index) => props.people[index].id = index); //atrybut key dla react

Po co w pętli odnosisz się do `props.people`, skoro masz tą wartość dostępną pod zmienną `el`?

I po co robisz specjalnie taką pętlę do nadpisania/dodania property `id`, skoro możesz od razu nadać tą wartość w `map` niżej?

props.people.map((person, index) => // <-- używasz `index` tak samo, jak dotychczas w .forEach
  <Person key={index /* tutaj `index` */} name={person.name} removal={handleRemove} />
)

Z tym, że użycie indeksu pętli nie jest optymalnym sposobem do tworzenia kluczy dla elementów listy. Zaleca się używanie unikalnej pośród rodzeństwa i stabilnej wartości, żeby React mógł jednoznacznie zidentyfikować dany element listy, nawet w przypadku zmiany ich kolejności.

https://reactjs.org/docs/lists-and-keys.html#keys

The best way to pick a key is to use a string that uniquely identifies a list item among its siblings. Most often you would use IDs from your data as keys

+

 When you don’t have stable IDs for rendered items, you may use the item index as a key as a last resort:

W podlinkowanej dokumentacji jest też odesłanie do szerszego objaśnienia na temat negatywnych aspektów stosowania indeksów jako kluczy.


I czy pracowanie ze stroną, w ten sposób (usuwanie elementu za pomocą element.remove(), a nie aktualizując state w komponencie klasowym) jest poprawne?

 Jeśli chodzi Ci o ten fragment kodu:

const handleRemove = (e) => { e.target.parentNode.remove() }

To lepiej jest przekazać propsem do komponentu dziecka callback, w którym usuniesz element tej tablicy poprzez aktualizację stanu w komponencie rodzicu i wtedy React odpowiednio skróci wyrenderowaną listę elementów. Bezpośrednio manipulacja na DOM powinna być traktowana jako ostateczność lub gdy API Reacta na coś nie pozwala.

https://reactjs.org/docs/refs-and-the-dom.html#when-to-use-refs

Podobne pytania

0 głosów
1 odpowiedź 445 wizyt
pytanie zadane 2 stycznia 2022 w JavaScript przez Meksykanin Początkujący (250 p.)
+1 głos
1 odpowiedź 232 wizyt
pytanie zadane 28 lutego 2022 w JavaScript przez Karson Obywatel (1,000 p.)
0 głosów
1 odpowiedź 214 wizyt
pytanie zadane 28 października 2022 w JavaScript przez chrystian Gaduła (4,780 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 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!

...