Wiem, że to pytanie zadawano już kilka razy, ale w większości przypadków rozwiązaniem jest radzenie sobie z tym u rodzica, ponieważ przepływ odpowiedzialności jest tylko malejący. Czasami jednak musisz zabić komponent jedną z jego metod. Wiem, że nie mogę modyfikować jego właściwości, a jeśli zacznę dodawać wartości logiczne jako stan, zacznie się robić naprawdę bałagan dla prostego komponentu. Oto, co próbuję osiągnąć: Mały komponent pola błędu z „x”, aby go odrzucić. Otrzymanie błędu za pośrednictwem jego właściwości spowoduje wyświetlenie go, ale chciałbym znaleźć sposób na zamknięcie go z własnego kodu.
class ErrorBoxComponent extends React.Component {
dismiss() {
// What should I put here?
}
render() {
if (!this.props.error) {
return null;
}
return (
<div data-alert className="alert-box error-box">
{this.props.error}
<a href="#" className="close" onClick={this.dismiss.bind(this)}>×</a>
</div>
);
}
}
export default ErrorBoxComponent;
Użyłbym tego w następujący sposób w komponencie nadrzędnym:
<ErrorBox error={this.state.error}/>
W sekcji Co mam tu umieścić? , Już próbowałem:
ReactDOM.unmountComponentAtNode(ReactDOM.findDOMNode(this).parentNode);
Co rzuca niezły błąd w konsoli:
Ostrzeżenie: unmountComponentAtNode (): Węzeł, który próbujesz odmontować, został wyrenderowany przez React i nie jest kontenerem najwyższego poziomu. Zamiast tego poproś komponent nadrzędny o zaktualizowanie swojego stanu i ponowne wyrejestrowanie w celu usunięcia tego komponentu.
Czy powinienem skopiować przychodzące właściwości w stanie ErrorBox i manipulować nimi tylko wewnętrznie?
Odpowiedzi:
Podobnie jak to miłe ostrzeżenie, które otrzymałeś, próbujesz zrobić coś, co jest anty-wzorcem w reakcji. To jest nie-nie. React ma na celu odłączenie od relacji rodzic-dziecko. Teraz, jeśli chcesz, aby dziecko się odmontowało, możesz to zasymulować za pomocą zmiany stanu w rodzicu, która jest wyzwalana przez dziecko. pokażę ci kod.
to jest bardzo prosty przykład. ale możesz zobaczyć szorstki sposób przekazania rodzicowi działania
Biorąc to pod uwagę, prawdopodobnie powinieneś przechodzić przez sklep (akcja wysyłkowa), aby Twój sklep zawierał prawidłowe dane, gdy ma być renderowany
Zrobiłem komunikaty o błędach / stanie dla dwóch oddzielnych aplikacji, obie przeszły przez sklep. Jest to preferowana metoda ... Jeśli chcesz, mogę opublikować kod, jak to zrobić.
EDYCJA: Oto jak skonfigurowałem system powiadomień za pomocą React / Redux / Typescript
Kilka rzeczy na początek. to jest w maszynie, więc musisz usunąć deklaracje typu :)
Używam pakietów npm lodash do operacji i nazw klas (alias cx) do przypisania w wierszu nazwy klasy.
Piękno tej konfiguracji polega na tym, że używam unikalnego identyfikatora dla każdego powiadomienia, gdy akcja je tworzy. (np. notify_id). Ten unikalny identyfikator to
Symbol()
. W ten sposób, jeśli chcesz usunąć jakiekolwiek powiadomienie w dowolnym momencie, możesz to zrobić, ponieważ wiesz, które z nich usunąć. Ten system powiadomień pozwoli Ci ułożyć tyle, ile chcesz, i znikną po zakończeniu animacji. Podłączam się do zdarzenia animacji i kiedy się kończy, uruchamiam kod, aby usunąć powiadomienie. Ustawiłem również rezerwowy limit czasu, aby usunąć powiadomienie na wypadek, gdyby wywołanie zwrotne animacji nie zostało uruchomione.powiadomienia-działania.ts
powiadomienie-reduktor.ts
app.tsx
w podstawowym renderowaniu dla twojej aplikacji wyrenderowałbyś powiadomienia
user-notification.tsx
klasa powiadamiania użytkownika
źródło
zamiast używać
ReactDOM.unmountComponentAtNode(ReactDOM.findDOMNode(this).parentNode);
spróbuj użyć
źródło
<div id="c1"><div id="c2"><div id="react-root" /></div></div>
. Co się stanie, jeśli wewnętrzny tekstc1
zostanie zastąpiony?W większości przypadków wystarczy po prostu ukryć element, na przykład w ten sposób:
Lub możesz renderować / wyrenderować / nie renderować przez komponent nadrzędny w ten sposób
Wreszcie jest sposób na usunięcie węzła html, ale naprawdę nie wiem, czy to dobry pomysł. Może ktoś, kto zna Reacta od wewnątrz, powie coś na ten temat.
źródło
Byłem w tym poście około 10 razy i chciałem tylko zostawić tutaj swoje dwa centy. Możesz po prostu odmontować go warunkowo.
Wszystko, co musisz zrobić, to usunąć go z DOM, aby go odmontować.
Tak długo, jak
renderMyComponent = true
komponent będzie renderowany. Jeśli ustawiszrenderMyComponent = false
, odmontujesz go z DOM.źródło
Nie jest to właściwe we wszystkich sytuacjach, ale możesz warunkowo
return false
wewnątrz samego komponentu, jeśli określone kryteria są lub nie są spełnione.Nie odmontowuje komponentu, ale usuwa całą renderowaną zawartość. Moim zdaniem byłoby to złe tylko wtedy, gdyby w komponencie były detektory zdarzeń, które należy usunąć, gdy komponent nie jest już potrzebny.
źródło