2016-03-21 72 views
0

Redux'u öğrenmek için basit bir web uygulaması başlatıyorum.İç içe geçmiş redüktörler

Kullanıcı adı ve parolayı doğrulayan bir "kimlik doğrulama" eylemi varsa. Ardından çağrılacak bir "giriş" veya "başarısız" eylemi istiyorum. Nasıl olduğunu anlayamıyorum. Kimlik doğrulama adımını çağırabilirim, ancak iç içe/sonraki çağrı yürütülmez.

Bir işlevi başka bir işlevin içinden çağırmak nasıl mümkündür?

Kodum aşağıdaki gibi görünür (benim sorunum ^^ aşağı kaynar ne kadar sinir bozucu budur): Bir indirgeyicide

function authenticateClient(state, client){ 
    if (client.password === 'perfectsec') 
     return dispatch(Actions.connectClient(client)); 
    else 
     return dispatch(Actions.refuseClient(client)); 
} 

çağrılması sevk yanlıştır. En basit olanı, doğrudan connectClient(state, client) veya refuseClient(state, client) işlevlerini çağırmak olacaktır. Ama sonra bu adım redux akışından geçmez.


bağlam kodu:

/* actions.js */ 

export function authenticateClient(client) { 
    return { type: Types.authenticateClient, client }; 
} 

export function connectClient(client, isNew) { 
    return { type: Types.connectClient, client, isNew }; 
} 

export function refuseClient(client) { 
    return { type: Types.refuseClient, client }; 
} 


/* main.js */ 

/* reducer */ 
const reducer = (state = loadState(), action) => { 
    console.log(chalk.red(`*${action.type}*`)); 
    switch (action.type) { 
    case Actions.Types.authenticateClient: 
     return authenticateClient(state, action); 
    case Actions.Types.connectClient: 
     return connectClient(state, action); 
    case Actions.Types.refuseClient: 
     return refuseClient(state, action); 
    default: 
     return state; 
    } 
}; 


/* store */ 
store = createStore(reducer); 


/* app */ 
store.dispatch(Actions.authenticateClient({username, password})); 
+0

Kodunuzu% 100 takip edemiyorum, bu yüzden sadece açıklığa kavuşturmak için - redüktörlerin içindeki eylemleri göndermeye çalışmıyorsunuz, değil mi? Çünkü bu eylemleri göndermek için% 100 _never_ olduğunuz bir yer. –

+0

Teşekkürler. Evet, tam olarak yapmaya çalıştığım şey bu. Ve bunun yanlış olduğunu fark ettim. Ama amacımı nasıl gerçekleştireceğimi anlamıyorum. Açıklığa kavuşturmaya çalışırken bir paragraf ekledim. –

+1

Eylemleri koşullu olarak göndermeniz gerekiyorsa, bu mantık büyük olasılıkla başka bir eylem oluşturucuda olmalıdır (örn. "Actions.connectClientIfValid (client)') - giriş geçerliyse, "Actions.connectClient (client)" sonucunu döndürür, değilse, 'Actions.refuseClient (client)' sonucunu döndürün. Sonra geri gönderilen her şeyi gönderebilirsiniz. Tüm redüktörünüzün yapması gereken 'state + action = newState' - uygulamanızın geri kalanında hiçbir zaman yan etkisi olmamalıdır. –

cevap

1

Redüktörler eylemleri sevk veya yan etkileri vardır başka bir şey yapmak asla. Bir redüktörün her zaman bir devlet ve eylemlerin saf bir işlevi olması gerekir (etkin bir şekilde state + action = newState) - tüm Redux kütüphanesi bu varsayım etrafında oluşturulmuştur ve sanırım bir redüktörün içindeki çağrıyı aramayı denerseniz bir hata atmak için özel olarak tasarlanmıştır.

şartlı bir eylem gönderme konusunda en iyi yol yeni bir 'eylem yaratıcısı' yaratmaktır - zaten uygulamada bunlardan birkaç tane vardır: standart eylem yaratıcıları yok

export function authenticateClient(client) { 
    return { type: Types.authenticateClient, client }; 
} 

export function connectClient(client, isNew) { 
    return { type: Types.connectClient, client, isNew }; 
} 

export function refuseClient(client) { 
    return { type: Types.refuseClient, client }; 
} 

Not olduğunu eylemi kendileri gönderir. Bunlar sadece 'un numaranızı, bir noktada kendiniz gönderebileceğiniz bir eylemdir (bu, bir eylem oluşturmak ve gerçekten göndermeden önce bir süre beklemeye almak istiyorsanız kullanışlıdır). Bir zamanlar eylemsiz içerik oluşturucuları yazmaya başladığınızda sular biraz bulanıklaşıyor, ama bu gerçekten probleminizin kapsamı içinde değil, bu yüzden şimdilik bunu atlayacağım (yine de belgelerin Async bölümünü okumayı öneriyorum!) kafanı bir kez aldığında güzel şeyler.

Burada anlatmaya çalıştığınız şey, 'bir koşul doğruysa bana connectClient eylemi verin, yoksa bana refuseClient eylemi' diyen bir işlevdir. Size bir eylem veren bir fonksiyonun, bizi bu cevabın ana noktasına götüren bir eylem yaratıcısı olduğunu biliyoruz: eylem yaratıcıları mantıksal olabilir. Bunların% 90'ı sadece veriyi alacak ve hemen bir nesne döndürecekken, bu sadece alabilecekleri tek form değil. İşte bu işlevsellik temsil edilebileceğini nasıl bir örnek:

Yine, hiçbir şey aslında bu işlevinden sevk alır
export function connectClientIfValid(client) { 
    if (client.valid === true) { 
    return connectClient(client); 
    } 
    else { 
    return refuseClient(client); 
    } 
} 

- sadece sen, boş zamanınızda sevk şöyle olabilir bir eylem, döndürür:

dispatch(connectClientIfValid(client)); 

Mantığınız çalışır ve redüktörünüzün saf/senkron yapısını bozmadan uygun eylemler gönderilir. Tüm redüktörünüzün yapması gerekenleri okumaktır ve durumu uygun şekilde günceller - eylemlerin gerçekleşmesine neden olan mantığı önemsemek zorunda değildir.

+0

Sabrınız için tekrar teşekkür ederiz. Gerçekten anladığımı anlatacağım. Gösterdiğiniz gibi, bir redüktör ve bir eylem yaratıcısı arasındaki farkın düz olması önemlidir. Yapmaya çalıştığım şey sadece bir "alt redüktör". AuthenticateClient bir redüktördür. Bu kullanım durumu için ['combineReducers'] (http://redux.js.org/docs/api/combineReducers.html) kullanabilirim. –

İlgili konular