Reat.js'de durum değişiklikleri nasıl dinlenir?


143

React.js'de açısalın $ watch işlevi eşdeğeri nedir?

Durum değişikliklerini dinlemek ve getSearchResults () gibi bir işlevi çağırmak istiyorum.

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

Yanıtlar:


37

Angular'ı kullanmadım, ancak yukarıdaki bağlantıyı okuduğunuzda, ele almanız gerekmeyen bir şeyi kodlamaya çalıştığınız anlaşılıyor. React bileşen hiyerarşisinde durum değişiklikleri yaparsınız (this.setState () aracılığıyla) ve React bileşeninizin yeniden oluşturulmasına neden olur (değişiklikleri etkili bir şekilde 'dinler'). Hiyerarşinizdeki başka bir bileşenden 'dinlemek' istiyorsanız, iki seçeneğiniz vardır:

  1. İşleyicileri ortak bir üst öğeden aşağı (sahne aracıyla) aktarın ve üst öğenin durumunu güncellemelerini sağlayarak üst öğenin altındaki hiyerarşinin yeniden oluşturulmasına neden olun.
  2. Alternatif olarak, hiyerarşide basamaklı işleyicilerin patlamasını önlemek için , durumunuzu veri depolarına taşıyan ve bileşenlerin değişiklikleri izlemek için izlemesine izin veren akı modeline bakmalısınız . Fluxxor eklentisi bu yönetmek için çok yararlıdır.

3
Ancak, durumu (parçası) bir url / a parametresi olarak kullanan uzak verileri getirmeniz gerektiğinde ne olur?
RnMss

@RnMss - redux ve redüktörlere ( redux.js.org/docs/basics/Reducers.html ) bakın ve ayrıca yeniden seçin ( github.com/reactjs/reselect ).
edoloughlin

320

Durum değiştiğinde aşağıdaki yaşam döngüsü yöntemleri çağrılır. Anlamlı bir şeyin değişip değişmediğini belirlemek için sağlanan bağımsız değişkenleri ve geçerli durumu kullanabilirsiniz.

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

5
Başka bir bileşendeki bir özellik güncellendiğinde bir yöntemin tetiklenmesi gerekiyordu (biri geri çağrı yoluyla, diğeri pervane üzerinden) ve componentDidUpdatepervane ile bileşen eklemek doğru reçete idi. Bunun için teşekkürler.
Keith DC

Bence bu OP'nin sorduğu durum değişikliklerinin bildirilmesini garanti etmenin en iyi yoludur. Ancak, mustComponentUpdate içindeki güncelleştirmeyi veto etmeniz durumunda, durum değişikliğinden sonra bu yöntemlerin hiçbirinin tetiklenmeyeceğini unutmayın.
MidnightJava

28
componentWillUpdatekullanımdan kaldırılıyor: reaktjs.org/blog/2018/03/27/update-on-async-rendering.html
Dmitry Minkovsky

1
olacaktır componentDidUpdatemutlaka, sadece zaman durum değişikliklerini yeni sahne alırken aynı zamanda ateş?
andy mccullough

1
componentWillUpdatekullanımdan kaldırıldı.
sean

29

Güncellemede bileşen güncellemenizi tetiklemesi gereken bir girdi özelliğiniz varmış gibi Bileşen Yaşam Döngüsü altında kullanmanız gerektiğini düşünüyorum. görünümde yansıtıyordu.

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

6
componentWillReceiveProps kullanımdan kaldırıldı: reaktjs.org/docs/…
John Skoumbourdis

14

2019'da useState ve useEffect Hooks ile React 16.8 olduğundan , aşağıdakiler artık eşdeğerdir (basit durumlarda):

angularjs:

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

<input ng-model="name" />

Tepki:

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

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

2

UseState with useEffect uygulamasını yukarıda açıklandığı gibi kullanmak kesinlikle doğru yoldur. Ancak getSearchResults işlevi abonelik döndürürse useEffect, aboneliği iptal etmekten sorumlu bir işlev döndürmelidir. UseEffect işlevinden döndürülen işlev, bağımlılıktaki her değişiklikten önce (yukarıdaki durumda ad) ve bileşen yok etme durumunda çalışır


1

Bir süre oldu, ancak ileride başvurmak için: shouldComponentUpdate () yöntemi kullanılabilir.

Güncelleme, sahne veya durum değişikliklerinden kaynaklanabilir. Bir bileşen yeniden oluşturulduğunda bu yöntemler aşağıdaki sırayla çağrılır:

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

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


shouldComponentUpdateBu kullanım durumu için uygun olmayabileceği için bir boole döndürmeniz gerekir.
sean
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.