Рендеринг дополнительного всплывающего диалогового окна при нажатии кнопки React

У меня проблемы с рендерингом всплывающего экрана загрузки. Итак, предположим, что у меня есть импортированный компонент с именем ( LoadingDialog ), и я хочу, чтобы он отображался, когда свойство состояния, загрузка, истинно. Когда пользователь нажимает кнопку на текущем компоненте, он запускает вызов API, который также изменяет состояние загрузки на true, тем самым отображая диалоговое окно загрузки.

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

 if (this.state.loading){
      return (
        <div>
        <LoadingDialog />
        </div>

      )
    }
    else{
      return(
      <div> OTHER UI ELEMENTS </div>
     )

но теперь у меня проблема, потому что, когда мой загрузочный диалог отображается, мой другой пользовательский интерфейс (текстовая область, фоновая карта, кнопка) исчезает, что противоположно тому, чего я пытаюсь достичь. При таком подходе я могу отображать только свои фактические элементы пользовательского интерфейса или диалоговое окно загрузки.

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

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

Вот мой фактический код:

 if (this.state.loading){
      return (
        <div>
        <LoadingDialog />
        </div>

      )
    }
    else{
      return (
        <div>
          <Card className = "center card">
            <div className = "row">
              <div class = "column" >
                <TextField
                  id = "outlined-name"
                  name = "searchContent"
                  onChange = {this.handleChangeEvent}
                  value = {this.state.searchContent}
                  label = "Name"
                  variant = "outlined"
                />
              </div>
              <div className = "column">
                <Button
                  variant = "outlined"
                  color = "primary"
                  onClick = {this.handleClick}
                >
                  Search
                </Button>
              </div>
            </div>
          </Card>
        </div>
      );
    }

и это моя функция щелчка ручки:


  handleClick = (event, name) => {
    this.setState({loading : true})
    fetch(uri)
      .then(res => res.json())
      .then(data => {
        console.info(data);
        this.setState({loading : false})
      });
  };

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

Я новичок в реагировании и держусь подальше от подобных редуксов, хуков и т. д.

Вам нужно <div>{this.state.loading && <LoadingDialog />}<div>main content</div></div>. Таким образом, вы будете отображать либо оба, либо только основной контент.

Chris G 29.05.2019 00:42

@ChrisG Это прекрасно. Большое спасибо. Кроме того, не стоит ли рендерить так много всего в одном компоненте?

Codeviews 29.05.2019 00:51
Поведение ключевого слова "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) для оценки ваших знаний,...
1
2
1 187
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

РЕШЕНО Благодаря Chris G

Таким образом, проблема была легко устранена с помощью логического оператора и, чтобы проверить, является ли загрузка истинной или ложной, например, так {this.state.loading && <LoadingDialog />}

например.

render(){
   return(
     <div>
       {this.state.loading && <LoadingDialog />}
     <div>
        //REST OF THE STUFF THAT SHOULD BE RENDERED REGARDLESS
     </div>
    </div>
    )
}

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