Реагировать на интеграцию компонента через функции (HOC)

Я создаю шаблон администратора с помощью responseJs, и один из компонентов, составляющих всю страницу, выглядит так.

class UserManagement extends React.Component {
    state = {
        showDeleteModal: false
    };

    _toggleDeleteModal = () => {
        this.setState(prevState => ({
          showDeleteModal: !prevState.showDeleteModal
        }));
    };

    onDeleteRow = () => {
        console.info("delete");
    };

    render() {
        return (
            <div>
              {this.state.showDeleteModal && (
                <DeleteModal
                  title = "Delete Data ?"
                  description = "Are you sure you want to delete this data from the system ?"
                  onDeleteAction = {this.onDeleteRow}
                  onToggleModal = {this._toggleDeleteModal}
                />
              )}
            </div>
        );
    }   
} 

DeleteModal - это, по сути, модальное окно, которое всплывает и отображает пользователю набор опций, на основе которых пользователь выбирает опцию, это один из многих модальных окон, содержащихся в этом компоненте UserManagement. Как видите, мне нужно записать код DeleteModal в функции рендеринга, выполнение этого для других модальных окон приводит к появлению на этой странице лишнего кода, который, вероятно, можно каким-то образом извлечь.

В конце концов, я хотел бы иметь возможность сделать что-то вроде этого

Поведение ключевого слова "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
0
53
2

Ответы 2

Я не получил четкого ответа на ваш вопрос, но надеюсь, что вы спрашиваете, как извлечь компонент DeleteModal. При этом, вот моя мысль;

class UserManagement extends React.Component {

    state = {
        showDeleteModal: false
    };

    _toggleDeleteModal = () => {
        this.setState(prevState => ({
          showDeleteModal: !prevState.showDeleteModal
        }));
    };

    onDeleteRow = () => {
        console.info("delete");
    };
    
    renderDeleteModal = () => (
      <DeleteModal
        title = {"Delete Data ?"}
        description = {
          "Are you sure you want to delete this data from the system ?"
        }
        onDeleteAction = {this.onDeleteRow}
        onToggleModal = {this._toggleDeleteModal}
      />
    );

    render() {
        return (
          <React.Fragment>
            {this.state.showDeleteModal && this.renderDeleteModal}
          </React.Fragment>
        );
    }

} 

Я предполагаю, что все модальные окна, которые у вас есть, имеют аналогичную структуру, и поскольку в любой момент времени пользователю будет показан только один модальный код. вы можете создать многоразовое модальное окно со следующими полями:

  1. Заголовок
  2. Описание
  3. Кнопка действия
  4. Кнопка отмены

Вы можете попробовать создать что-то вроде этого:

class UserManagement extends React.Component {

    constructor(props) {
        this.state = {
            showModal: false,
            modalTitle: "",
            modalDescription: "",
            modalAction: null
        }
    }

    showDeleteModal() {
        this.setState(prevState => ({
            modalTitle: "Delete Data ?",
            modalDescription: "Are you sure you want to delete this data from the system ?",
            modalAction: this.onDeleteRow
        }), this._toggleDeleteModal)
    }

    _toggleDeleteModal = () => {
        this.setState(prevState => ({
        showModal: !prevState.showModal
        }))
    };

    onDeleteRow = () => {
        console.info("delete");
    };

    render() {
        return (
            <div>
            {this.state.showModal && (
                <Modal
                    data = {this.state.modal}
                    onToggleModal = {this._toggleModal}
                />
            )}
        </div>
        );
    }

} 

У вас может быть одна конкретная функция для каждого вашего варианта использования (например, Удалить), которая устанавливает этот заголовок, описание и т. д.

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

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