2016-08-22 3 views
2

Мой редуктор не обновит мое дерево состояний Redux, и я не нашел решение, поэтому я надеялся получить некоторую помощь. Это мой код:Состояние Redux не обновляется

Reducer

import Immutable from 'seamless-immutable' 
import { loadFirebaseData } from '../actions/firebaseActions' 

const FETCH_FIREBASE_DATA = 'FETCH_FIREBASE_DATA' 

const initialState = Immutable({}) 

export default function firebaseReducer(state = initialState, action) { 
    switch (action.type) { 
    case FETCH_FIREBASE_DATA: 
    return state 
    .set('firebaseData', fetchData(action)) 
    } 
    return state 
} 


function fetchData(action) { 
    return { 
    firebaseData: action.firebaseData 
    } 
} 

App

class App extends Component { 

    componentWillMount() { 
    this.props.fetchFirebaseData('gallery') 
    } 

function mapStateToProps(state) { 
    console.log('state',state.firebaseReducer) 
    return { 
    galleryItems: state.firebaseReducer 
    } 
} 

function mapDispatchToProps(dispatch) { 
    return bindActionCreators(firebaseActions, dispatch) 
} 

export default connect(mapStateToProps, mapDispatchToProps)(App) 

И если бы я выйти из исполнения редуктора:

import Immutable from 'seamless-immutable' 
import { loadFirebaseData } from '../actions/firebaseActions' 

const FETCH_FIREBASE_DATA = 'FETCH_FIREBASE_DATA' 

const initialState = Immutable({}) 

export default function firebaseReducer(state = initialState, action) { 

    console.log(1) 
    switch (action.type) { 

    case FETCH_FIREBASE_DATA: 
    console.log(2) 
    return state 
    .set('firebaseData', fetchData(action)) 
    } 

    console.log(3) 
    console.log('state', state) 
    return state 
} 


function fetchData(action) { 
    return { 
    firebaseData: action.firebaseData 
    } 
} 

Консольные показы:

1 
3 
state: Object {__immutable_invariants_hold: true} 
1 
3 
Object {__immutable_invariants_hold: true} 
Object {__immutable_invariants_hold: true} 
1 
2 

Таким образом, на последнем этапе состояние не обновляется. Любые мысли о том, почему? Спасибо!

ответ

0

Я думаю, что вы используете неправильную функцию для внесения изменений в свой магазин. Поскольку вы используете seamless-immutable, set функция ожидает в качестве параметров 2 строки: ключ и значение. В коде вы передаете ему строку и объект.

Согласно seamless-immutable documentation установить state.firebaseData к значению, принятому action.firebaseData использования функции слияния с объектом, как:

export default function firebaseReducer(state = initialState, action) { 
    switch (action.type) { 
    case FETCH_FIREBASE_DATA: 
     return state 
     .merge(fetchData(action)) 
    } 
    return state 
} 

Другой вопрос, я вижу с представленной, например, что в mapStateToPros функции вы обращаетесь к члену firebaseReducer из которое нигде не найдено. Вы намеревались нанести на карту state.firebaseData?

Смежные вопросы