React
Reakcja Cykl życia komponentów
Szukaj…
Wprowadzenie
Metody cyklu życia służą do uruchamiania kodu i interakcji z komponentem w różnych momentach życia komponentów. Metody te opierają się na komponencie Montowanie, aktualizowanie i odmontowywanie.
Tworzenie komponentów
Po utworzeniu komponentu React wywoływanych jest szereg funkcji:
- Jeśli używasz
React.createClass
(ES5), wywoływanych jest 5 funkcji zdefiniowanych przez użytkownika - Jeśli używasz
class Component extends React.Component
(ES6), wywoływane są 3 funkcje zdefiniowane przez użytkownika
getDefaultProps()
(tylko ES5)
Jest to pierwsza metoda o nazwie.
Wartości rekwizytów zwrócone przez tę funkcję będą używane jako wartości domyślne, jeśli nie zostaną zdefiniowane podczas tworzenia komponentu.
W poniższym przykładzie parametr this.props.name
zostanie domyślnie this.props.name
na Bob
jeśli nie zostanie określony inaczej:
getDefaultProps() {
return {
initialCount: 0,
name: 'Bob'
};
}
getInitialState()
(tylko ES5)
Jest to druga metoda o nazwie.
getInitialState()
wartość getInitialState()
określa stan początkowy składnika React. Środowisko React wywoła tę funkcję i przypisze wartość this.state
do this.state
.
W poniższym przykładzie this.state.count
zostanie zainicjalizowany wartością this.props.initialCount
:
getInitialState() {
return {
count : this.props.initialCount
};
}
componentWillMount()
(ES5 i ES6)
Jest to trzecia metoda o nazwie.
Tej funkcji można użyć do wprowadzenia ostatecznych zmian w komponencie przed jego dodaniem do DOM.
componentWillMount() {
...
}
render()
(ES5 i ES6)
Jest to czwarta metoda o nazwie.
Funkcja render()
powinna być czystą funkcją stanu składnika i rekwizytów. Zwraca pojedynczy element, który reprezentuje komponent podczas procesu renderowania i powinien być albo reprezentacją natywnego komponentu DOM (np. <p />
), albo komponentem złożonym. Jeśli nic nie powinno być renderowane, może zwrócić null
lub undefined
.
Ta funkcja zostanie przywołana po każdej zmianie rekwizytów lub stanu komponentu.
render() {
return (
<div>
Hello, {this.props.name}!
</div>
);
}
componentDidMount()
(ES5 i ES6)
Jest to piąta metoda o nazwie.
Komponent został zamontowany i masz teraz dostęp do węzłów DOM komponentu, np. Poprzez refs
.
Metodę tę należy stosować do:
- Przygotowanie timerów
- Pobieranie danych
- Dodawanie detektorów zdarzeń
- Manipulowanie elementami DOM
componentDidMount() {
...
}
Składnia ES6
Jeśli komponent jest zdefiniowany przy użyciu składni klasy ES6, nie można użyć funkcji getDefaultProps()
i getInitialState()
.
Zamiast tego deklarujemy nasze defaultProps
jako właściwość statyczną w klasie oraz deklarujemy kształt stanu i stan początkowy w konstruktorze naszej klasy. Oba są ustawione na instancji klasy w czasie budowy, zanim zostanie wywołana jakakolwiek inna funkcja cyklu życia React.
Poniższy przykład demonstruje to alternatywne podejście:
class MyReactClass extends React.Component {
constructor(props){
super(props);
this.state = {
count: this.props.initialCount
};
}
upCount() {
this.setState((prevState) => ({
count: prevState.count + 1
}));
}
render() {
return (
<div>
Hello, {this.props.name}!<br />
You clicked the button {this.state.count} times.<br />
<button onClick={this.upCount}>Click here!</button>
</div>
);
}
}
MyReactClass.defaultProps = {
name: 'Bob',
initialCount: 0
};
Zastępowanie getDefaultProps()
Domyślne wartości rekwizytów komponentów są określone przez ustawienie właściwości defaultProps
klasy:
MyReactClass.defaultProps = {
name: 'Bob',
initialCount: 0
};
Zastępowanie getInitialState()
Idiomatycznym sposobem ustawienia początkowego stanu komponentu jest ustawienie this.state
w konstruktorze:
constructor(props){
super(props);
this.state = {
count: this.props.initialCount
};
}
Aktualizacja komponentu
componentWillReceiveProps(nextProps)
Jest to pierwsza funkcja wywoływana przy zmianach właściwości .
Kiedy właściwości komponentu ulegną zmianie , React wywoła tę funkcję z nowymi właściwościami . Możesz uzyskać dostęp do starych rekwizytów za pomocą this.props i do nowych rekwizytów za pomocą nextProps .
Za pomocą tych zmiennych można wykonać pewne operacje porównania między starymi i nowymi rekwizytami lub wywołać funkcję, ponieważ zmiana właściwości itp.
componentWillReceiveProps(nextProps){
if (nextProps.initialCount && nextProps.initialCount > this.state.count){
this.setState({
count : nextProps.initialCount
});
}
}
shouldComponentUpdate(nextProps, nextState)
Jest to druga funkcja wywoływana w przypadku zmian właściwości i pierwsza w przypadku zmian stanu .
Domyślnie, jeśli inny komponent / twój komponent zmieni właściwość / stan twojego komponentu, React wyświetli nową wersję twojego komponentu. W takim przypadku funkcja zawsze zwraca true.
Możesz zastąpić tę funkcję i wybrać bardziej precyzyjnie, czy komponent musi zostać zaktualizowany, czy nie .
Ta funkcja jest najczęściej używana do optymalizacji .
W przypadku, gdy funkcja zwraca false , proces aktualizacji zatrzymuje się natychmiast .
componentShouldUpdate(nextProps, nextState){
return this.props.name !== nextProps.name ||
this.state.count !== nextState.count;
}
componentWillUpdate(nextProps, nextState)
Ta funkcja działa jak componentWillMount()
. Zmiany nie są w DOM , więc możesz wprowadzić zmiany tuż przed wykonaniem aktualizacji.
/! \: nie można użyć this.setState () .
componentWillUpdate(nextProps, nextState){}
render()
Są pewne zmiany, więc ponownie renderuj komponent.
componentDidUpdate(prevProps, prevState)
Te same rzeczy, co componentDidMount()
: DOM został odświeżony , więc możesz tutaj popracować nad DOM.
componentDidUpdate(prevProps, prevState){}
Usunięcie komponentu
componentWillUnmount()
Ta metoda jest wywoływana przed odłączeniem komponentu od DOM.
Jest to dobre miejsce do wykonywania operacji czyszczenia, takich jak:
- Usuwanie detektorów zdarzeń.
- Kasowanie liczników czasu.
- Zatrzymywanie gniazd.
- Usuwanie stanów redux.
componentWillUnmount(){
...
}
Przykład usunięcia dołączonego detektora zdarzeń w module componentWillUnMount
import React, { Component } from 'react';
export default class SideMenu extends Component {
constructor(props) {
super(props);
this.state = {
...
};
this.openMenu = this.openMenu.bind(this);
this.closeMenu = this.closeMenu.bind(this);
}
componentDidMount() {
document.addEventListener("click", this.closeMenu);
}
componentWillUnmount() {
document.removeEventListener("click", this.closeMenu);
}
openMenu() {
...
}
closeMenu() {
...
}
render() {
return (
<div>
<a
href = "javascript:void(0)"
className = "closebtn"
onClick = {this.closeMenu}
>
×
</a>
<div>
Some other structure
</div>
</div>
);
}
}
Reaguj pojemnik z komponentami
Podczas budowania aplikacji React często pożądane jest dzielenie komponentów w oparciu o ich podstawową odpowiedzialność, na komponenty prezentacji i kontenera.
Komponenty prezentacji dotyczą wyłącznie wyświetlania danych - można je traktować jako funkcje przekształcające model w widok i często zaimplementowane jako takie. Zazwyczaj nie utrzymują żadnego stanu wewnętrznego. Komponenty kontenera dotyczą zarządzania danymi. Można tego dokonać wewnętrznie za pośrednictwem ich własnego państwa lub działając jako pośrednicy w bibliotece zarządzania stanem, takiej jak Redux. Komponent kontenera nie wyświetla bezpośrednio danych, a raczej przekazuje dane do komponentu prezentacji.
// Container component
import React, { Component } from 'react';
import Api from 'path/to/api';
class CommentsListContainer extends Component {
constructor() {
super();
// Set initial state
this.state = { comments: [] }
}
componentDidMount() {
// Make API call and update state with returned comments
Api.getComments().then(comments => this.setState({ comments }));
}
render() {
// Pass our state comments to the presentational component
return (
<CommentsList comments={this.state.comments} />;
);
}
}
// Presentational Component
const CommentsList = ({ comments }) => (
<div>
{comments.map(comment => (
<div>{comment}</div>
)}
</div>
);
CommentsList.propTypes = {
comments: React.PropTypes.arrayOf(React.PropTypes.string)
}
Wywołanie metody cyklu życia w różnych stanach
Ten przykład służy jako uzupełnienie innych przykładów, które mówią o tym, jak korzystać z metod cyklu życia i kiedy metoda zostanie wywołana.
W tym przykładzie podsumowano, które metody (componentWillMount, componentWillReceiveProps itp.) Zostaną wywołane oraz w jakiej kolejności będzie różna dla komponentu w różnych stanach :
Po zainicjowaniu komponentu:
- getDefaultProps
- getInitialState
- componentWillMount
- renderowanie
- componentDidMount
Gdy stan składnika ulegnie zmianie:
- shouldComponentUpdate
- componentWillUpdate
- renderowanie
- componentDidUpdate
Gdy element ma zmienione rekwizyty:
- componentWillReceiveProps
- shouldComponentUpdate
- componentWillUpdate
- renderowanie
- componentDidUpdate
Gdy składnik jest odmontowywany:
- componentWillUnmount