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();
}
Eniz Gülek
źródło

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.
edoloughlin
źródło
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)
Derek Slager
źródło
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
28
componentWillUpdatejest przestarzały: actjs.org/blog/2018/03/27/update-on-async-rendering.html
Dmitry Minkovsky
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
  });
}
hasain
źródło
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)} />
Aprillion
źródło
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

Shivang Gupta
źródło
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

Malvinka
źródło
Będziesz musiał zwrócić wartość logiczną z, shouldComponentUpdatewięc może nie być odpowiednia w tym przypadku użycia.
sean