Как использовать mapStateToProps внутри другого действия?

#javascript #reactjs #redux #react-redux #react-hooks

Вопрос:

Поскольку я новичок в redux, может ли кто-нибудь помочь мне, если есть возможность внести изменения в одно действие на основе изменения состояния из другого файла.

actions.js

 export function setChangeNotification(changeNotification: boolean) {
return {
    type: SET_CHANGE_NOTIFICATION,
    changeNotification
};
}
 

Toolbar.js

 endMeetingForAll () {
    const { _changeNotification } = this.props;
    this.props.dispatch(setChangeNotification(true)); //changed value set to true but at default it's false in my initial state.
    console.log(_changeNotification,'changeNotification from end meeting'); //Checked if value changed using mapStateToProps. 
}
function _mapStateToProps(state) {
    return {
    _changeNotification: Boolean(state['features/toolbox'].changeNotification)
};
}
export default translate(connect(_mapStateToProps)(Toolbox));
 

Еще один action.js где мне нужно что-то изменить

 export function notifyKickedOut(participant: Object, _: ?Function) { // eslint-disable-line 
no-unused-vars
return (dispatch: Dispatch<any>, getState: Function) => {
    const args = {
        participantDisplayName:
            getParticipantDisplayName(getState, participant.getId())
    };
    dispatch(showNotification({
        appearance: NOTIFICATION_TYPE.ERROR,
        hideErrorSupportLink: true,
        descriptionKey: 'dialog.kickMessage',
        descriptionArguments: args,
        titleKey: 'dialog.kickTitle',
        titleArguments: args
    }));
    //JAAM CODE
    // when the paticipant removed after redirect to the website.
    setTimeout(
        () => {
            window.APP.conference.hangup(false);
            executeCommand('hangup');
            window.close();
        },
        NOTIFICATION_TIMEOUT);
};
}
 

В приведенном выше action.js Мне нужно отправить еще одно подтверждение shownotification, если значение setChangeNotification верно, например

   if(changeNotification){
    dispatch(showNotification({
        appearance: NOTIFICATION_TYPE.ERROR,
        descriptionKey: 'dialog.changed',
        titleKey: 'dialog.changed'
    })); 
   }else{
   dispatch(showNotification({
        appearance: NOTIFICATION_TYPE.ERROR,
        hideErrorSupportLink: true,
        descriptionKey: 'dialog.kickMessage',
        descriptionArguments: args,
        titleKey: 'dialog.kickTitle',
        titleArguments: args
    }));
 

}

Ответ №1:

У вас есть доступ к штату по телефону getState() . Поскольку это похоже на thunk (создатель асинхронного действия), вы можете отправить туда любое действие, которое вам нужно.

Комментарии:

1. У меня тут небольшая проблема. Мое состояние не обновляется даже после отправки. Он остается ложным всегда, как в исходном состоянии.

2. @shanks_9790 Нам нужно было бы увидеть ваш редуктор, чтобы отладить это, я думаю, трудно сказать, что происходит не так.

3. dropbox.com/s/pfl6npthzr3r1op/reducer.txt?dl=0 Можете ли вы заглянуть в этот редуктор?

4. @shanks_9790 Да, все выглядит нормально. Может быть, в вашей настройке что-то другое. Вероятно, лучше исправить простое изменение состояния, прежде чем заставлять тук работать.

5. Есть ли какой-то другой способ обновить его в магазине?