Jak odsłuchiwać zmiany stanu w respond.js?


143

Jaki jest odpowiednik funkcji $ watch kątowej w React.js?

Chcę słuchać zmian stanu i wywołać funkcję, taką jak getSearchResults ().

componentDidMount: function() {
    this.getSearchResults();
}

Odpowiedzi:


37

Nie korzystałem z Angulara, ale czytając powyższy link, wydaje się, że próbujesz zakodować coś, z czym nie musisz sobie radzić. Dokonujesz zmian stanu w swojej hierarchii komponentów React (poprzez this.setState ()), a React spowoduje ponowne renderowanie twojego komponentu (efektywnie „nasłuchując” zmian). Jeśli chcesz „słuchać” innego komponentu w swojej hierarchii, masz dwie możliwości:

  1. Funkcje obsługi przekazu w dół (przez właściwości) ze wspólnego rodzica i każą im aktualizować stan rodzica, powodując ponowne renderowanie hierarchii poniżej rodzica.
  2. Alternatywnie, aby uniknąć eksplozji procedur obsługi, które spadają kaskadowo w dół hierarchii, należy przyjrzeć się wzorowi przepływu , który przenosi stan do magazynów danych i umożliwia komponentom obserwowanie ich pod kątem zmian. Wtyczki Fluxxor jest bardzo przydatna do zarządzania tym.

3
Ale co z sytuacją, gdy musisz pobrać zdalne dane, które używają (części) stanu jako parametru url / a?
RnMss

@RnMss - spójrz na redux i reduktory ( redux.js.org/docs/basics/Reducers.html ), a także wybierz ponownie ( github.com/reactjs/reselect ).
edoloughlin

320

Następujące metody cyklu życia zostaną wywołane w przypadku zmiany stanu. Możesz użyć dostarczonych argumentów i bieżącego stanu, aby określić, czy coś istotnego się zmieniło.

componentWillUpdate(object nextProps, object nextState)
componentDidUpdate(object prevProps, object prevState)

5
Musiałem wyzwolić metodę, gdy właściwość w innym komponencie została zaktualizowana (o jedną w górę przez wywołanie zwrotne, o jedną w dół przez prop), a dodanie componentDidUpdatekomponentu z właściwością było właściwą receptą. Dzięki za to.
Keith DC

Myślę, że to najlepszy sposób na zagwarantowanie powiadamiania o zmianach stanu, o co prosił PO. Należy jednak pamiętać, że żadna z tych metod nie zostanie uruchomiona po zmianie stanu, jeśli zawetujesz aktualizację w aplikacji shouldComponentUpdate.
MidnightJava


1
componentDidUpdatenie będzie również odpalać po otrzymaniu nowych rekwizytów, niekoniecznie tylko po zmianie stanu?
andy mccullough

1
componentWillUpdatejest przestarzałe.
sean

29

Myślę, że powinieneś używać poniższego cyklu życia komponentu, tak jakbyś miał właściwość wejściową, która podczas aktualizacji musi wyzwolić aktualizację komponentu, jest to najlepsze miejsce do zrobienia tego, ponieważ zostanie wywołane przed renderowaniem, możesz nawet zaktualizować stan komponentu, aby był odzwierciedlone w widoku.

componentWillReceiveProps: function(nextProps) {
  this.setState({
    likesIncreasing: nextProps.likeCount > this.props.likeCount
  });
}

6
KomponentWillReceiveProps został wycofany: awarejs.org/docs/…
John Skoumbourdis

14

Od czasu React 16.8 w 2019 roku z użyciem hooków useState i useEffect , poniższe są teraz równoważne (w prostych przypadkach):

AngularJS:

$scope.name = 'misko'
$scope.$watch('name', getSearchResults)

<input ng-model="name" />

Reagować:

const [name, setName] = useState('misko')
useEffect(getSearchResults, [name])

<input value={name} onChange={e => setName(e.target.value)} />

2

Używanie useState z useEffect, jak opisano powyżej, jest całkowicie poprawne. Ale jeśli funkcja getSearchResults zwraca subskrypcję, useEffect powinien zwrócić funkcję, która będzie odpowiedzialna za anulowanie subskrypcji. Zwracana funkcja z useEffect będzie działać przed każdą zmianą zależności (nazwa w powyższym przypadku) i zniszczeniem komponentu


1

Minęło trochę czasu, ale do wykorzystania w przyszłości: można użyć metody shouldComponentUpdate ().

Aktualizacja może być spowodowana zmianami właściwości lub stanu. Te metody są wywoływane w następującej kolejności, gdy składnik jest ponownie renderowany:

static getDerivedStateFromProps() 
shouldComponentUpdate() 
render()
getSnapshotBeforeUpdate() 
componentDidUpdate()

ref: https://reactjs.org/docs/react-component.html


Będziesz musiał zwrócić wartość logiczną z, shouldComponentUpdatewięc może nie być odpowiednia w tym przypadku użycia.
sean
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.