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

    @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) при нажатии на кнопку создать, страница перезагружается
    Ответ написан