2016-04-12 28 views
12

Örneğin ... beklendiği gibi varsayılan localStorage gelen devlet döndüren ne yaptığımı bir küçültülmüş versiyonu var Redux'un başlangıç ​​durumunda localStorage'ı kullanabilir misiniz?

export const user = (state = { 
    id: localStorage.getItem('id'), 
    name: localStorage.getItem('name'), 
    loggedInAt: null 
}, action) => { 
    case types.LOGIN: 
     localStorage.setItem('name', action.payload.user.name); 
     localStorage.setItem('id', action.payload.user.id); 
     return { ...state, ...action.payload.user } 

    default: 
     return { ...state, loggedInAt: Date.now() } 
} 

. Ancak, sayfamı yeniledikten sonra uygulamamın durumu aslında boş. Hiçbir yan etkisi, yani düşürücüler yana

const initialState = { 
    id: localStorage.getItem('id'), 
    name: localStorage.getItem('name'), 
    loggedInAt: null 
}; 

const store = createStore(mainReducer, initialState); 

saf fonksiyonları olmalıdır ve localStorage.setItem:

createStore(reducer, [initialState], [enhancer]) 

Yani böyle bir şey yapabilirsiniz:

+0

:

Başka bir seçenek onBeforeUnload kullanarak sayfa kapatılır ülkeyi sadece (yenileme sayımları) tasarruf etmektir? uygulama ihtiyaçlarınıza bağlı olarak. –

+0

@AvraamMavridis bir şekilde kötü bir uygulama gibi geliyorsa. –

cevap

22

Redux createStore 2 param mağaza başlatma için tasarlanmıştır test kesinlikle zarar verecek bir yan etkidir, redüktörde localStorage'a kaydetmekten kaçınmalısınız. Bunun yerine şunları yapabilirsiniz:

store.subscribe(() => { 
    const { id, name } = store.getState(); 

    localStorage.setItem('name', name); 
    localStorage.setItem('id', id); 
}); 

Bu zaman durum değişikliklerini olur, bu nedenle performansı etkileyebilir. ? Eğer `size gerektiği anlamına ne`

window.onbeforeunload =() => { 
    const { id, name } = store.getState(); 

    localStorage.setItem('name', name); 
    localStorage.setItem('id', id); 
}; 
+0

Bu mükemmel! Çok teşekkür ederim! –

+0

Ve yine başka bir seçenek mağaza vatansız tutmak yardımcı olmak için middleware ile pouchDB ve couchDB gibi bir şey kullanmaktır. – ZekeDroid