React - обработка запроса на удаление данных

Внимание

Данный материал является частью цикла статей «Создаем приложение на React с использованием Redux». Не забудьте посмотреть другие статьи по этой теме :-)

  1. React - Настройка проекта и подготовка компонентов
  2. React - навигация и маршрутизация
  3. React - использование Redux в приложении React
  4. React – Lazy Loading и компоненты высшего порядка (HOC)
  5. React - обработка исключений
  6. React - создание динамических форм и модальных компонентов
  7. React - валидация формы и обработка POST запроса
  8. React - обработка запроса PUT для редактирования данных
  9. React - обработка запроса на удаление данных

Подготовка компонента DeleteOwner и маршрута для удаления

Внутри папки Owner создадим новую папку и назовем ее DeleteOwner. Внутри мы собираемся создать новый файл DeleteOwner.js:

Теперь изменим файл DeleteOwner.js с помощью кода базовой настройки:

import React, { Component } from 'react';
import Aux from '../../../hoc/Auxiliary/Auxiliary';

class DeleteOwner extends Component {
    render() { 
        return ( 
            <Aux>
                
            </Aux>
         )
    }
}
 
export default DeleteOwner;

Чтобы включить навигацию к этому компоненту, нам нужно изменить файл App.js:

import DeleteOwner from './Owner/DeleteOwner/DeleteOwner';
<Route path="/deleteOwner/:id" component={DeleteOwner} />

Прямо сейчас, если мы нажмем кнопку «Удалить» в компоненте OwnerList, мы перейдем на страницу DeleteOwner (даже если внутри нее нет содержимого).

Соединение нашего компонента с редьюсером

Прежде всего, нам нужно добавить операторы импорта:

import * as repositoryActions from '../../../store/actions/repositoryActions';
import * as errorHandlerActions from '../../../store/actions/errorHandlerActions';
import { connect } from 'react-redux';

Следующее, что нам нужно сделать, это добавить функцию mapStateToProps прямо под классом:

const mapStateToProps = (state) => {
  return {
     data: state.repository.data,
     showSuccessModal: state.repository.showSuccessModal,
     showErrorModal: state.errorHandler.showErrorModal,
     errorMessage: state.errorHandler.errorMessage
  }
}

Затем добавьте функцию mapDispatchToProps:

const mapDispatchToProps = (dispatch) => {
    return {
        onGetOwnerById: (url, props) => dispatch(repositoryActions.getData(url, props)),
        onDeleteOwner: (url, props) => dispatch(repositoryActions.deleteData(url, props)),
        onCloseSuccessModal: (url, props) => dispatch(repositoryActions.closeSuccessModal(props, url)),
        onCloseErrorModal: () => dispatch(errorHandlerActions.closeErrorModal())
    }
}

Итак, весь этот код достаточно знаком (если вы читали предыдущие части).

Далее, изменим инструкцию export:

export default connect(mapStateToProps, mapDispatchToProps)(DeleteOwner);

Реализация JSX в компоненте DeleteOwner

Чтобы создать представление для этого компонента, нам нужно сначала добавить операторы импорта:

import { Well, Button, Col, Row, ControlLabel } from 'react-bootstrap';
import Moment from 'react-moment';

Прямо между блоками render и return нам нужно добавить этот код:

let owner = {...this.props.data};

Внутри тега Aux добавим контент, который мы собираемся отображать на странице:

<Row>
   <Col md={10}>
       <Well>
           <Row>
              <Col md={3}>
                 <ControlLabel htmlFor='name'>Owners name:</ControlLabel>
              </Col>
              <Col md={7}>
                  <span name='name'>{owner.name}</span>
              </Col>
           </Row>
           <Row>
              <Col md={3}>
                  <ControlLabel htmlFor='dateOfBirth'>Date of birth:</ControlLabel>
              </Col>
              <Col md={7}>
                  <span name='dateOfBirth'><Moment format="MM/DD/YYYY">{owner.dateOfBirth}</Moment></span>
              </Col>
           </Row>
           <Row>
              <Col md={3}>
                  <ControlLabel htmlFor='address'>Address:</ControlLabel>
              </Col>
              <Col md={7}>
                  <span name='address'>{owner.address}</span>
              </Col>
            </Row>
       </Well>
    </Col>
</Row>

Ниже тега Row нам нужно отобразить кнопки на странице:

<Row>
   <Col mdOffset={8} md={1}>
       <Button type="submit" bsStyle="info" onClick={this.deleteOwner}>Delete</Button>
   </Col>
   <Col md={1}>
        <Button bsStyle='danger' onClick={this.redirectToOwnerList}>Cancel</Button>
   </Col>
</Row>

Наконец, давайте добавим операторы импорта для модальных компонентов:

import SuccessModal from '../../../components/Modals/SuccessModal/SuccessModal';
import ErrorModal from '../../../components/Modals/ErrorModal/ErrorModal';

Сразу после этого, под тегом Row и прямо над тегом Aux, давайте добавим код для отображения наших модальных компонентов:

<SuccessModal show={this.props.showSuccessModal} modalHeaderText={'Success message'}
      modalBodyText={'Action completed successfylly'}
      okButtonText={'OK'}
      successClick={() => this.props.onCloseSuccessModal('/owner-List', { ...this.props })} />
<ErrorModal show={this.props.showErrorModal} modalHeaderText={'Error message'}
      modalBodyText={this.props.errorMessage}
      okButtonText={'OK'}
      closeModal={() => this.props.onCloseErrorModal()} />

Теперь мы можем проверить результат:

Как видно на скриншоте выше, у нас нет всех данных на странице, но мы собираемся исправить это в ближайшее время.

Реализация бизнес-логики для действия удаления

Чтобы получить объект owner с сервера, мы добавим функцию componentDidMount прямо над функцией рендеринга:

componentDidMount = () => {
    const id = this.props.match.params.id;
    const url = '/api/owner/' + id;
    this.props.onGetOwnerById(url, { ...this.props });
}

Теперь, если мы перейдем к компоненту OwnerDelete, мы увидим страницу с правильными данными:

Чтобы кнопка "Отмена" работала, давайте добавим эту функцию:

redirectToOwnerList = () => {
    this.props.history.push('/owner-List');
}

Затем реализуем действие удаления:

deleteOwner = (event) => {
    event.preventDefault();

    const url = "/api/owner/" + this.props.data.id;

    this.props.onDeleteOwner(url, { ...this.props });
}

Мы можем проверить результат:

Если мы нажмем кнопку ОК, мы будем перенаправлены на компонент OwnerList.

Заключение

Мы завершили наш путь к этому проекту React. Надеемся, вам понравилось так же, как и нам.

Спасибо, что прочитали статью, и я надеюсь, что вы нашли в ней что-то полезное.