@cfif11

Как сделать модальное окно в react & redux?

Хочу по нажатии кнопки сделать модальное окно, с формой для добавления нового объекта. Как этого добиться на основе react и redux?
  • Вопрос задан
  • 8024 просмотра
Решения вопроса 1
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@cfif11 Автор вопроса
Не получается к этому делу приделать redux.

Вот код контейнера:
let name;
let description;
const customStyles = {
	content : {
		...
	}
};

let LeftMenu = ({modalIsOpen, firstButtonClick, close}) => {
	return (
		<div>
			<nav >
				<ul className='LMenu'>
					<MenuButton text = {FIRST_BUTTON} onClick = {() => firstButtonClick(<Modal/>)}/>
					...
				</ul>
			</nav>
			<Modal
				isOpen={modalIsOpen}
				onRequestClose={close}
				style={customStyles}
			>

				<h2 ref='subtitle'>Hello</h2>
				<button onClick={close}>close</button>
				<div>I am a modal</div>

				<form onSubmit={e => {
					e.preventDefault();
					createFamily(name.value, description.value)
				}}>
					<ul>
						<li><input placeholder='Введите название семьи'
						           ref={node1 => {name = node1}}/></li>
						<li><input placeholder='Введите описание семьи'
						           ref={node2 => {description = node2}}/></li>
						<button type='submit'>Создать</button>
					</ul>
				</form>
			</Modal>
		</div>
	);
};

LeftMenu.propTypes = {
	modalIsOpen: PropTypes.bool.isRequired,
	firstButtonClick: PropTypes.func.isRequired,
	close: PropTypes.func.isRequired
};

const mapDispatchToProps = (dispatch) => {
	return {
		firstButtonClick: () => dispatch(createFamilyModal()),
		close: () => dispatch(closeFamilyModal())
	}
};

const mapStateToProps = (state) => {
	return {
		modalIsOpen: state.modalIsOpen
	}
};

LeftMenu = connect(
	mapStateToProps,
	mapDispatchToProps
)(LeftMenu);


export default LeftMenu


действия:
export function createFamilyModal() {
	return {
		type: CREATE_FAMILY_MODAL
	}
}

export function closeFamilyModal() {
	return {
		type: CLOSE_FAMILY_MODAL
	}
}

export function createFamily(familyName, description) {
	return {
		type: CREATE_FAMILY,
		familyName,
		description
	}
}


и редьюсеры:
\\ updateModel reducer
const updateModal = (state = false, action) => {
	switch (action.type) {
	case CREATE_FAMILY_MODAL:
		return true;
	case CLOSE_FAMILY_MODAL:
		return false;
	default:
		return state;
	}
};

\\ family reducer
let initialState = {
	isEmpty: true,
	familyName: '',
	description: '',
	persons: [],
	isFetching: false
};

const family = (state = initialState, action) => {
	switch(action.type) {
	case CREATE_FAMILY:
		return Object.assign({}, state, {
			isEmpty: false,
			familyName: action.familyName,
			description: action.description
		});
	default:
		return state;
	}
};

\\ index reducer
const FamilyTreeApp = combineReducers({
	family: family,
	modalIsOpen: updateModal
});


1)После нажатия на кнопку меню, состояние меняется правильно и появляется модальное окно, фон затемняется, но в консоле выскакивает ошибка
invariant.js?568c:39 Uncaught Invariant Violation: Stateless function components cannot have refs.
2)После нажатия на кнопку close, состояние меняется правильно, фон становится обычным, но окно не пропадает. В консоле ошибка:
ReactOwner.js?40e0:84 Uncaught TypeError: Cannot read property 'refs' of null
3) при вводе данных в инпут, происходит тоже что и на этапе 2
4) при нажатии на кнопку создать, страница перезагружается
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы