Jak wymusić re-render w Reakcie?

React

readTime

3 min

Jak wymusić re-render w Reakcie?

Komponenty funkcyjne nie mają wbudowanej metody ponownego renderowania komponentów, tak jak robią to ich odpowiedniki oparte na klasach. Oznacza to, że nie mamy do dyspozycji metody forceUpdate(). Przypomnijmy jednak, że w React komponenty są zazwyczaj renderowane z powodu zmian stanu lub propsów (właściwości).

Wiedząc o tym, mamy kilka sposobów na wymuszenie przerenderowania komponentu.

Od wersji 16.8+ React posiada koncepcję zwaną Hookami, która może być używana w komponentach funkcyjnych do aktualizacji stanu, wykonywania efektów ubocznych itp. Wykorzystamy te hooki na naszą korzyść, aby ponownie wyrenderować komponent.

Oto kilka przykładów, jak wymusić aktualizację w komponencie funkcyjnym:

Poniższe hooki powinny być używane tylko w wyjątkowych przypadkach. Należy re-renderować komponenty tylko wtedy, gdy zmieni się jego stan.

Re-render komponentu funkcyjnego za pomocą useReducer

reducer.js

_10
import React, { useReducer } from 'react'
_10
_10
const [ignored, forceUpdate] = useReducer(x => x + 1, 0);
_10
_10
function handleClick() {
_10
forceUpdate();
_10
}

useReducer w Reakcie jest zwykle używany, gdy mamy złożoną logikę stanu i akcje. Tutaj używamy go po prostu do wyzwalania aktualizacji poprzez aktualizację fikcyjnej zmiennej stanu, x. Stan musi faktycznie ulec zmianie, aby wyzwolić aktualizację, dlatego jest zwiększany przy każdym wywołaniu.

Wymuszenie aktualizacji komponentu za pomocą useState

useForceUpdate.js

_16
_16
import React, { useState } from 'react'
_16
_16
// Tworzymy customowy hook useForceUpdate hook, który korzysta z useState()
_16
const useForceUpdate = () => useState()[1];
_16
_16
// wywołujemy custom hook wewnątrz komponentu
_16
const Hooks = () => {
_16
const forceUpdate = useForceUpdate();
_16
_16
return (
_16
<button onClick={forceUpdate}>
_16
Update me
_16
</button>
_16
);
_16
};

Powyższy przykład odpowiada funkcjonalności metody forceUpdate w komponentach klasowych.

Hook ten działa w następujący sposób:

Hook useState zwraca tablicę z dwoma elementami z wartością początkową przekazaną do funkcji hooka i funkcją aktualizującą.

W powyższym przykładzie natychmiast wywołujemy funkcję aktualizującą, która w tym przypadku jest wywoływana z undefined, więc jest to to samo, co wywołanie set...(undefined).

Jak widzisz, istnieje wiele sposobów na osiągnięcie tego samego celu. Należy pamiętać, że są to technicznie anty-wzorce i należy ich unikać, gdy tylko jest to możliwe. Ale jeśli nie jesteś w stanie rozwiązać podstawowego problemu i musisz wymusić aktualizację komponentu, to każda z metod, które tutaj pokazałem, powinna zadziałać.

authorImg

Witek Pruchnicki

Z pasją dzielę się wiedzą o programowaniu i nie tylko na różne sposoby

Spis treści