Действие не обновляет магазин

| У меня есть следующий компонент на основе это:

**WarningModal.js**

import React from 'react';
import ReactDOM from 'react-dom';
import {connect, Provider} from 'react-redux';
import PropTypes from 'prop-types';

import {Alert, No} from './pure/Icons/Icons';
import Button from './pure/Button/Button';
import Modal from './pure/Modal/Modal';

import {setWarning} from '../actions/app/appActions';

import configureStore from '../store/configureStore';

const store = configureStore();

export const WarningModal = (props) => {
    const {message, withCleanup} = props;
    const [
        title,
        text,
        leave,
        cancel
    ] = message.split('|');

    const handleOnClick = () => {
        props.setWarning(false);
        withCleanup(true);
    }

    return(
        <Modal>
            <header>{title}</header>
            <p>{text}</p>
            <Alert />
            <div className = "modal__buttons-wrapper modal__buttons-wrapper--center">
                <button 
                    onClick = {() => withCleanup(false)} 
                    className = "button modal__close-button button--icon button--icon-only button--text-link"
                >
                    <No />
                </button>
                <Button id = "leave-warning-button" className = "button--transparent-bg" onClick = {() => handleOnClick()}>{leave}</Button>
                <Button id = "cancel-warning-button" onClick = {() => withCleanup(false)}>{cancel}</Button>
            </div>
        </Modal>
    );
}

WarningModal.propTypes = {
    withCleanup: PropTypes.func.isRequired,
    message: PropTypes.string.isRequired,
    setWarning: PropTypes.func.isRequired
};

const mapStateToProps = state => {
    console.info(state)
    return {
        isWarning: state.app.isWarning
    }
};

const WarningModalContainer = connect(mapStateToProps, {
    setWarning
})(WarningModal);




export default (message, callback) => {
    const modal = document.createElement('div');
    document.body.appendChild(modal);

    const withCleanup = (answer) => {
        ReactDOM.unmountComponentAtNode(modal);
        document.body.removeChild(modal);
        callback(answer);
    };

    ReactDOM.render(
        <Provider store = {store}>
            <WarningModalContainer 
                message = {message} 
                withCleanup = {withCleanup} 
            />
        </Provider>,
        modal
    );
};

у меня проблема заключается в том, что setWarning не обновляет состояние, он вызывается, поскольку у меня есть отладчик внутри действия и редуктора, но фактическое свойство не меняется на false, когда:

props.setWarning(false);

называется.

Я использую следующее для запуска пользовательского модального окна:

    const togglePromptCondition = 
        location.hash === '#access-templates' || location.hash === '#security-groups' 
            ? promptCondition
            : isFormDirty || isWarning;

<Prompt message = {promptMessage} when = {togglePromptCondition} />

Чтобы еще больше проверить это, я добавил в приложение 2 кнопки для переключения isWarning (свойство состояния, о котором я говорю), и оно работает должным образом.

Я думаю, что хотя WarningModal подключен, на самом деле это не так.

РЕДУКТОР

...
    case SET_WARNING:
        console.info('reducer called: ', action)
        return {
            ...state,
            isWarning: action.payload 
        };
...

ДЕЙСТВИЕ

...
export const setWarning = status => {
    console.info('action called')
    return {
        type: SET_WARNING,
        payload: status
    }
};
...

ОБНОВИТЬ

После того, как необходимо включить следующее:

const mapStateToProps = state => {
    return {
        isWarning: state.app.isWarning
    }
};

const mapDispatchToProps = dispatch => {
    return {
        setWarning: (status) => dispatch({ type: 'SET_WARNING', payload: status })
    }
};

Теперь я получаю:

Действие не обновляет магазин

Может, это поможет?

Вы можете показать свой редуктор? Вероятно, проблема там.

Colin Ricardo 22.11.2018 13:19

@Colin Я обновил код редуктором и действием. Спасибо

Aessandro 22.11.2018 14:45

У тебя const SET_WARNING = 'SET_WARNING' определился?

Varit J Patel 22.11.2018 14:49
console.info('action called'), а что там status, если туда записать?
Colin Ricardo 22.11.2018 14:55

@Colin, который не вызывается после загрузки модального окна

Aessandro 22.11.2018 15:15

@Colin, хотя компонент подключен, метод, похоже, не обновляет хранилище / состояние после визуализации WarningModal.

Aessandro 22.11.2018 15:19
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
6
70
1

Ответы 1

Вы должны отправлять действия в создателе действий, и тип действия для отправки всегда должен быть строковым.

Попробуй это

const mapStateToProps = state => {
   console.info(state)
   return {
       isWarning: state.app.isWarning
   }
};

const mapDispatchToProps = dispatch => {
   console.info(dispatch)
   return {
       setWarning: (status) => dispatch({ type: 'SET_WARNING', payload: status })
   }
};

const WarningModalContainer = connect(mapStateToProps, mapDispatchToProps)(WarningModal);

РЕДУКТОР

...
    case 'SET_WARNING':
        console.info('reducer called: ', action)
        return {
            ...state,
            isWarning: action.payload 
        };
...

Привет, это здорово, но теперь я получаю сообщение об ошибке при вызове handleOnClick.

Aessandro 22.11.2018 16:13

Почему это будет иметь значение, если SET_WARNING = 'SET_WARNING'?

Colin Ricardo 22.11.2018 16:19

Это тоже поможет @Colin

Matheswaaran 23.11.2018 06:03

Другие вопросы по теме