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

ukrycie wszystkich divów nie przekazując parametru do metody w klasie ES6 [javascript]

Object Storage Arubacloud
0 głosów
341 wizyt
pytanie zadane 6 października 2017 w JavaScript przez dav Początkujący (250 p.)
edycja 6 października 2017 przez dav

Witam

Mam klasę:

{

const divs = document.querySelectorAll('.div');

class Divs {
  constructor(index) {
    this.index = index;
    this.init();
  }

  hideAllDivs(i) {
    divs[i].classList.add('hide')
  }

  removeClassHideFromElement() {
    divs[this.index].classList.remove('hide')
  }

  init() {
    for(let i = 0; i < divs.length; i++) {
      this.hideAllDivs(i);
    }
    this.removeClassHideFromElement();
  }  

}

const example = new Divs(0);

}

w której chcę ukryć wszystkie divy, ale pierwszy niech będzie widoczny. Na innym forum pewien użytkownik odpisał mi:

hideAllImages bierze parametr, po co skoro wykonuje jedną czynność - ukrywa wszystkie divy?

 ale niestety nie rozwinął swojej myśli, a ja teraz się zastanawiam czy miał rację czy to ja robię coś źle. Nie rozumiem kompletnie o co mu chodziło, przecież jak chcę ukryć wszystkie moje divy to muszę je wrzucić w pętlę i przekazać funkcji hideAllDivs zmienną bez tego przecież mi to nie ruszy. Myślałem nad tym jak nie przekazać parametru by to zrobić tak jak napisał ten użytkownik, ale jedyne co przychodzi mi do głowy to po prostu usunąć tą funkcję hideAllDivs a jej kod wstawić do pętli, czyli tak by to wyglądało:

{

const divs = document.querySelectorAll('.div');

class Divs {
  constructor(index) {
    this.index = index;
    this.init();
  }

  removeClassHideFromElement() {
    divs[this.index].classList.remove('hide')
  }

  init() {
    for(let i = 0; i < divs.length; i++) {
      divs[i].classList.add('hide');
    }
    this.removeClassHideFromElement();
  }  

}

const example = new Divs(0);

}

czy jest na to jakieś inne rozwiązanie, czy właśnie tak to powinienem zrobić?

całość do wglądu tutaj: https://jsfiddle.net/9rqmfnj7/

komentarz 6 października 2017 przez Jedras Maniak (54,860 p.)
Ten kod ma coś wspólnego z klasami ? ;)
komentarz 6 października 2017 przez dav Początkujący (250 p.)
no ma, przynajmniej tak mi się wydaje, a dlaczego według Ciebie nie ma?
komentarz 6 października 2017 przez Ehlert Ekspert (212,670 p.)
@Jedras a czemu ten kod miałby mieć coś wspólnego z klasami?
komentarz 6 października 2017 przez dav Początkujący (250 p.)

która rzecz nie ma nic wspólnego z klasami? ta zmienna?

const divs = document.querySelectorAll('.div');

2 odpowiedzi

+1 głos
odpowiedź 7 października 2017 przez kap Stary wyjadacz (11,620 p.)
wybrane 7 października 2017 przez dav
 
Najlepsza

Po pierwsze - metoda `hideAllDivs` nie robi tego na co wskazuje jej nazwa, ukrywa pojedynczy div, zgodnie z nazwą powinna wyglądać tak:

 

hideAllDivs() {
  for(let i = 0; i < divs.length; i++) {
    divs[i].classList.add('hide')
  }
}

 

Po drugie, jeśli chciałbyś by ukrywała pojedynczy element to trzeba zmienić jej nazwę. Dodatkowo nie powinieneś przekazywać tam indeksu tylko cały div, inaczej jest nieuniwersalna:

 

hideDiv(div) {
  div.classList.add('hide')
}

 

Po trzecie - obie wersje powinny być metodami prywatnymi skoro nie są wywoływane bezpośrednio.

Oczywiście o wiele lepsza jest wersja pierwsza, gdyż chowa detale implementacyjne iteracji w osobnej metodzie.

Dodatkowo elegantszym sposobem byłoby zastosowanie `forEach` (forEach samo w sobie ukrywa zbędne detale iteracji):

 

hideAllDivs() {
  [...divs].forEach(div => div.classList.add('hide'))
}

 

I ostatnia rzecz - divs jest u ciebie zmienną nielokalną, nie należącą do obiektu - bez sensu, jak już robisz klasę to zachowój enkapsulację i utwórz zmienną divs w konstruktorze.

komentarz 7 października 2017 przez dav Początkujący (250 p.)
i o to mi chodziło, bardzo Ci dziękuję za ten komentarz
komentarz 7 października 2017 przez kap Stary wyjadacz (11,620 p.)
Proszę bardzo
0 głosów
odpowiedź 6 października 2017 przez Ehlert Ekspert (212,670 p.)
Moim zdaniem kombinujesz ok. Jednak sam element div jest zbyt małą i ogólną częścią dokumentu.

Proponuję Ci zaznajomić się z Reactem. Korzystając z niego i ES6 tworzysz komponenty. O wiele łatwiej nimi zarządzać i oddzielać logikę od widoku.

Podobne pytania

0 głosów
1 odpowiedź 381 wizyt
pytanie zadane 6 kwietnia 2018 w JavaScript przez dziedziu Początkujący (370 p.)
+1 głos
1 odpowiedź 362 wizyt
pytanie zadane 29 listopada 2017 w JavaScript przez UltraSF Stary wyjadacz (11,740 p.)
0 głosów
2 odpowiedzi 254 wizyt
pytanie zadane 24 listopada 2017 w JavaScript przez goran. Użytkownik (930 p.)

92,576 zapytań

141,426 odpowiedzi

319,651 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!

...