| У меня есть следующий компонент на основе это:
**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 Я обновил код редуктором и действием. Спасибо
У тебя const SET_WARNING = 'SET_WARNING' определился?
console.info('action called'), а что там status, если туда записать?
@Colin, который не вызывается после загрузки модального окна
@Colin, хотя компонент подключен, метод, похоже, не обновляет хранилище / состояние после визуализации WarningModal.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы должны отправлять действия в создателе действий, и тип действия для отправки всегда должен быть строковым.
Попробуй это
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.
Почему это будет иметь значение, если SET_WARNING = 'SET_WARNING'?
Это тоже поможет @Colin
Вы можете показать свой редуктор? Вероятно, проблема там.