Redux'da durumu güncelledikten sonra geri aramayı nasıl tetikleyebilirim?


86

React'te, durum anında güncellenmez, bu nedenle içinde geri aramayı kullanabiliriz setState(state, callback). Ama Redux'da nasıl yapılır?

Aradıktan sonra this.props.dispatch(updateState(key, value)), güncellenmiş durumla hemen bir şeyler yapmam gerekiyor.

React'te yaptığım gibi en son duruma sahip bir geri aramayı aramamın bir yolu var mı?


Kullanır thunkmısın
Pranesh Ravi

1
dispatch()Senkronize bir aktivite olduğunu düşünüyorum . Güncellenen durum bir sonraki satırda bulunmalıdır.
Pranesh Ravi

4
@PraneshRavi Ben de öyle düşündüm. Ama eski duruma sahibim. Kullanmadım thunk.
Tuğla Yang


1
Evet gönderme eşzamanlıdır, ancak bileşenin props'larının sonraki güncellemesi senkronize değildir. Bu nedenle, yeniden düzenleme durumu bir sonraki satırda güncellenir, ancak bileşenin özellikleri henüz değildir.
amik

Yanıtlar:


113

yeni sahne alabilmek için bileşen güncellenmelidir.

hedefinize ulaşmanın yolları vardır:

1. componentDidUpdate değerin değişip değişmediğini kontrol edin, sonra bir şeyler yapın ..

 componentDidUpdate(prevProps){
     if(prevProps.value !== this.props.value){ alert(prevProps.value) }
  }

2. yeniden düzenleme vaadi (ara yazılım, sözün çözümlenmiş değerini gönderecektir)

export const updateState = (key, value)=>
Promise.resolve({
  type:'UPDATE_STATE',
  key, value
})

sonra bileşende

this.props.dispatch(updateState(key, value)).then(()=>{
   alert(this.props.value)
})

2. redux-thunk

export const updateState = (key, value) => dispatch => {
  dispatch({
    type: 'UPDATE_STATE',
    key,
    value,
  });
  return Promise.resolve();
};

sonra bileşende

this.props.dispatch(updateState(key, value)).then(()=>{
   alert(this.props.value)
})

6
Senin içinde redux-thunkörneğin, kullanmak dispatcho zaman uyumlu olduğu gibi. Durum bu mu?
Danny Harding

2
@DannyHarding dispatchsenkronize değildir. Olmadan Promise.resolve(), this.props.valuehala eski değerini döndürecektir. Bir tür eşzamansız erteleme hala gereklidir ( setTimeoutörneğin , bir içinden başvurmak da işe yarar).
Drazen Bjelovuk

4
@DrazenBjelovuk Redux-thunk örneğindeki updateState işlevinin hemen ardından return Promise.resolve () gönderimi (someAction) olduğu için merak ediyorum. Sözler derhal çözülür ve bu, redux mağaza güncellemesi ile bileşende çağrılan .sonra arasında bir yarış durumu yaratacağını düşünürüm. Sevk, bir söz vermediğinden veya bir geri aramayı kabul etmediğinden, bunun redux mağazasının ne zaman güncellendiğini bilmenin doğru bir yolu olduğunu düşünmüyorum. Bence just-boris'in cevabının bu durumda doğru olduğunu düşünüyorum
Danny Harding

2
@DannyHarding Evet, bu yöntemin büyük olasılıkla kesin bir yangın garantisi olmadığını kabul ediyorum, sadece gönderimin senkronize olmadığını gösteriyor.
Drazen Bjelovuk

1
Burada redux-thunk çözümünü kullanmaya çalışıyorum, ama sadece anlıyorum TypeError: _this.props.dispatch is not a function?
Krillko

14

React ile ilgili en önemli nokta tek yönlü veri akışıdır. Örneğinizde bu, bir eylem gönderme ve durum değişikliği işlemenin ayrıştırılması gerektiği anlamına gelir.

"Benim yaptığım gibi Sence olmamalı Aartık, Xolur Y" Ne zaman yaparım ve ben bunu hallederiz "ama Xolur Yherhangi bir bağlantısı olmayan," A. Mağaza durumu, bileşeninize ek olarak birden çok kaynaktan güncellenebilir, Time Travel da durumu değiştirebilir ve Agönderim noktanızdan geçilmez.

Temel componentWillReceivePropsolarak bu, @Utro tarafından önerildiği gibi kullanmanız gerektiği anlamına gelir



1
Katılıyorum ama bu bir antipattern
Giacomo Cerquone

1
artık componentWillReceivePropskullanımdan kaldırılan ne yapacağız ? static getDerivedStateFromProps()anlayabildiğim kadarıyla geri
aranamayacağı

9

Hooks API ile:

useEffect giriş olarak prop ile.

import React, { useEffect} from 'react'
import { useSelector } from 'react-redux'

export default function ValueComponent() {
   const value = useSelector(store => store.pathTo.value)

   useEffect(() => {
     console.log('New value', value) 
     return () => {
        console.log('Prev value', value) 
     }

   }, [value])

   return <div> {value} </div>
}

Kabul edilen cevap React Hooks'tan önce yazılmıştır. Kancaların tanıtılmasından sonra şimdi kabul edilen cevap bu olmalıdır. Değişiklikleri halletmenin daha reaktif bir yolu.
tif

5

subscribeDinleyiciyi kullanabilirsiniz ve bir eylem gönderildiğinde çağrılacaktır. Dinleyicinin içinde en son mağaza verilerini alacaksınız.

http://redux.js.org/docs/api/Store.html#subscribelistener


2
subscribeyalnızca bir eylem gönderildiğinde tetiklenir. subscribeAPI çağrınızın herhangi bir veri döndürüp döndürmediğini size bildirmenin bir yolu yok .. Sanırım! : D
Mihir

İsteğiniz tamamlandığında (başarılı veya başarısız olarak) başka bir eylem gönderebilirsiniz.
Jam

Burada önerilen diğer çözümlerden hiçbirinin gerçekten işe yaradığına ikna olmadım, çünkü durum güncellendikten sonra çözümleme sözü veya geri arama yolu görmüyorum. Bu yöntem, yalnızca etkinliğinizden sonra olan değil, her mağaza güncellemesi için çağrılır, ancak bu, çalışmak için çok zor olmamalıdır. Özellikle, bağlantı, bağlandığınız sayfadan özel bir observeStore yardımcı programı yazmak çok yararlıdır.
Nat Kuhn

Bağlantı Sayfası Bulunamadı
Bharat Modi

2

Geri arama ile thunk kullanabilirsiniz

myThunk = cb => dispatch =>
  myAsyncOp(...)
    .then(res => dispatch(res))
    .then(() => cb()) // Do whatever you want here.
    .catch(err => handleError(err))

İhtiyacım olan şey için mükemmel!
JSON C11

-1

Basit bir çözüm olarak şunları kullanabilirsiniz: redux-promise

Ama redux-thunk kullanıyorsanız , şöyle bir şey yapmalısınız:

function addCost(data) {
  return dispatch => {
    var promise1 = new Promise(function(resolve, reject) {
      dispatch(something);
     });
    return promise1;
  }
}

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.