2016-03-24 18 views
0

Soru: Redresörde defaultState döndürmek güvenli midir? Eğer güvende değilse lütfen, devletin mutasyona uğratma şansı olduğunda bana bir örnek verin. Başka bir yerde defaultState mutasyona değiliz ve onu istediğiniz yeni durumunu yansıtır Eğerredux düşürücü dönüş 'defaultState' yapmak güvenli midir?

const defaultState = { 
    test: 'test 
} 

function testReducer(state, action) { 
    switch action.type 
     case RETURN_DEFAULT_STATE: 
     return defaultState; // is this ok to do? or need {...defaultState} 
    default: 
     return state; 
} 

cevap

1

, ben sorunun ne olacağını görmüyorum. Zaten bir sorun var bu zaten yapmamalısın

store.dispatch({type: "RETURN_DEFAULT_STATE"}); 
store.getState().x = "x"; 

Not ve: senin örneğin kod hiçbir değişiklik ile

: Burada

bazı defaultState makul mutasyona uğrayabilir nasıl örnekleridir Eğer sen.

Şimdi, örnek kodun değiştirilmiş versiyonu: eğer

export const defaultState = { 
    test: 'test 
} 

function testReducer(state, action) { 
    switch action.type 
     case RETURN_DEFAULT_STATE: 
     return defaultState; // is this ok to do? or need {...defaultState} 
    default: 
     return someOtherReducer(state, action); 
} 

function someOtherReducer(state, action) { 
    state.x = "x"; 
    return state; 
} 

Not zaten someOtherReducer() zaten ne yaptığını ve gereken bir sorun var.

import {defaultState} from "whatever"; 

defaultState.x = "x";  
store.dispatch({type: "RETURN_DEFAULT_STATE"}); 
store.dispatch({type: "UNKNOWN"}); 
+0

defaultState'i başka bir yere nasıl değiştirebilirim? Bir örnek verebilir misiniz? – Bruce

+1

Bir sonraki redüktörde, durumu 'store.getState() 'ile döndürerek ve bunu değiştirerek, ancak defaultState' i bir yere göndererek/dışa aktararak (bu, gönderdiğiniz örnek kodda açıkça görülmez) ve bunu değiştirerek. – JMM

+0

, defaultState'in aktarma/dışa aktarma ile nasıl mutasyona uğramasının kötü bir örneğini görmek güzel olurdu. Şu anda bunu görmüyorum ama mümkün olduğunu söylediniz – Bruce

1

O kadar uzun kod Tx`qflk`q yazma tüm geliştiriciler giriş parametreleri mutasyona etmeyecek şekilde güvenlidir. Yanlışlıkla herhangi bir mutasyonu önlemek için Object.assign'u öneririm.

Hatalı kod örneği: Bu sürece hiçbir yerde mutasyona yok gibi bir sorun olmamalı

const defaultState = { 
    test: 'test' 
}; 

function testReducer(state, action) { 
    switch action.type 
     case RETURN_DEFAULT_STATE: 
     return defaultState; // is this ok to do? or need {...defaultState} 
     case DO_MALICIOS_MUTATION: 
     state.test='foo'; // this might potentially mutate original defaultState object 
     return defaultState; 
    default: 
     return state; 
} 
+0

güzel örnekle ... evet muhtemelen {... defaultState} – Bruce

1

. Ancak, kaza ile mutasyona uğramış bir nesnenin neden olduğu bir hatayı yaşadım. Bu nedenle ben size devlet varsayılan durum nesnesi dondurabilirsiniz mutasyona olmadığından emin olmak istiyorsanız tavsiye:

const defaultState = Object.freeze({ 
    test: 'test 
}); 

Eğer bir istisna olsun sıkı modda böyle bir donmuş nesneyi değiştirmeye çalışırsanız.

+0

güzel güzel nesnesi ile sopa. donmak – Bruce

İlgili konular