2016-12-12 3 views
0

Я использую reselect и реагирую на сокращение. Я пытаюсь сделать селектор для базовой модальной реализации.Reselect Невозможно прочитать свойство 'get' of undefined

мой селектор

const selectModal = (state) => state.get('modal'); 

, который бросает ошибку

Cannot read property 'get' of undefined 

редактирования: Это было предложено мне показать, как я называю выберите модальность, хотя это не должно иметь никакого значения.

const mapStateToProps = createStructuredSelector({ 
    isVisible: selectModalIsVisible(), 
}); 
const mapDispatchToProps = { 
    hideModal, 
    showModal 
}; 
export default connect(mapStateToProps, mapDispatchToProps)(Modal); 

Я считаю, что это означает, что модальное состояние контейнер не найден

Возможно, я устанавливаю мой редуктор или хранить неправильно. Мой редуктор

function modalReducer(state = initialState, action) { 
    switch (action.type) { 
    case HIDE_MODAL: 
     return state.set(
     'isVisible', false); 
    case SHOW_MODAL: 
     return state.set(
     'isVisible', true); 
    default: 
     return state; 
    } 
} 

который совмещен с комбинатом восстановителей в шар

export default function createReducer(asyncReducers){ 
    return combineReducers({ 
    route: routeReducer, 
    auth: authReducer, 
    modal: modalReducer, 
    ...asyncReducers 
    }); 
} 

, а затем вводили в мой магазин

function configureStore(initialState = {}, history) { 
    const middlewares = [ 
    sagaMiddleware, 
    routerMiddleware(history), 
    ]; 
    const enhancers = [ 
    applyMiddleware(...middlewares), 
    ] 
    const store = createStore(
    createReducer(), 
    fromJS(initialState), 
    compose(...enhancers) 
); 

    store.runSaga = sagaMiddleware.run; 
    //store.close =() => store.dispatch(END) 

    store.runSaga(sagas); 
    store.asyncReducers = {}; 
    return store; 
} 
var initialState = {} 
const store = configureStore(fromJS(initialState), browserHistory); 

Ошибка в Reselect находится на линии 73/74 Params = dependencies.map

var selector = function selector(state, props) { 
    for (var _len4 = arguments.length, args = Array(_len4 > 2 ? _len4 - 2 : 0), _key4 = 2; _key4 < _len4; _key4++) { 
    args[_key4 - 2] = arguments[_key4]; 
    } 

    var params = dependencies.map(function (dependency) { 
    return dependency.apply(undefined, [state, props].concat(args)); 
    }); 
    return memoizedResultFunc.apply(undefined, _toConsumableArray(params)); 
}; 

Так что я делаю неправильно, мне нужно что-то делать с immutableJS по-другому, чтобы получить доступ к модальному, или моя настройка для приложения неверна? Заранее благодарю вас за отзывы.

+0

Пожалуйста, добавьте код, который вызывает 'selectModal'. –

+0

@JimBolla, это не должно иметь никакого значения, так как ошибка вызывается задолго до этой точки. Я беспокоюсь, что больше будет путать больше, чем что-либо, но я добавил. – mibbit

+0

Большинство селекторов имеют форму 'selector = state => doSomething (state)', а ваш 'selector =() => (state) => doSomething (state)'. Я что-то упускаю? –

ответ

1

Если вы используете selectModal, как вы используете selectModalIsVisible, тогда ваш синтаксис неверен. Я уверен, что createStructuredSelector не понимает () => (state) => state.get('modal'). Было бы только принять (state) => state.get('modal')

Как правило, мои обычаи createStructuredSelector будет выглядеть либо

const getThing = (state, props) => state.things[props.thingId]; 
const getModal = state => state.get('modal'); 

const mapStateToProps = createStructuredSelector({ 
    thing: getThing, // notice no parens 
    modal: getModal, // notice no parens 
}) 

ИЛИ если мне нужно селекторные заводов:

// just pretend this selector was more complicated and needed memoization 
const makeGetThing =() => createSelector(
    state => state.things, 
    (state, props) => props.thingId, 
    (things, thingId) => things[thingId]); 
const getModal = state => state.get('modal'); 

const makeMapStateToProps =() => createStructuredSelector({ 
    thing: makeGetThing(), // yes parens 
    modal: getModal, // no parens 
}) 
+0

thankyou за ваши отзывы @ jim-bolla Я видел этот синтаксис в некотором примере кода, пытаясь заставить его работать. Однако, если я вернусь к const = (state) => state.get ('modal'), я получаю тот же результат. Интересно, не подключаю ли мои селекторы в свой магазин? Или мой магазин создан неправильно. – mibbit

+0

вот пример шаблона() => (state) => https://github.com/mxstbr/react-boilerplate/blob/master/app/containers/HomePage/selectors.js – mibbit