Arhn - архитектура программирования

React - запретить монтирование всех дочерних компонентов при загрузке

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

Сообщения StackOverflow, которые я нашел о монтировании компонентов, касаются предотвращения их повторного рендеринга при изменениях. У меня есть 3 раздела, и я хочу, чтобы при загрузке страницы отображался только один. Я хочу, чтобы Timer появился первым. Когда кнопка запуска нажата, я хочу, чтобы появились Вопросы. Наконец, когда либо таймер достигает нуля, либо пользователь нажимает кнопку отправки, появляются результаты. Отдельные компоненты работают так, как я хочу, но я хочу скрыть их, пока они не будут вызваны. FYI - (selectedOption) из зависимости React-Select.

Репозиторий: https://github.com/irene-rojas/pixar-react

Приложение

import React, { Component } from 'react';
import './App.css';
import Timer from "./Timer";
import Questions from "./Questions/Questions.js";
import Results from "../src/Results";

class App extends Component {

state = {
    totalTrue: 0,
    totalFalse: 0,
}

componentDidMount() {
    return (
        <Timer />
    )
}

// submit button
handleFormSubmit = event => {
    event.preventDefault();
    console.log("submit button clicked");
        return (
            <Results />
        )
};

callbackHandlerFunction = ( selectedOption ) => {
    const answerValue = selectedOption.value;
    if (answerValue === true) {
        this.setState({totalTrue: this.state.totalTrue + 1}, () => {
            console.log(`New TotalTrue: ${this.state.totalTrue}`);
        });
    };
    if (answerValue === false) {
        this.setState({totalFalse: this.state.totalFalse + 1}, () => {
            console.log(`New TotalFalse: ${this.state.totalFalse}`);
        });
    };
  } 

  render() {
    return (

  <div className="parallax">

    <div className="App">

        <div className="wrapper">

        <div className="headerDiv">
            <h1>Pixar Trivia!</h1>
        </div>

        <div className="timerDiv">
            <Timer />   
        </div>

        <div className="questionSection">
            <Questions 
                handleClickInParent={this.callbackHandlerFunction} 
            />

            <div>
                <button onClick={this.handleFormSubmit}>Submit</button>
            </div>
        </div>



        {/* this code will hide Results until these conditions are met. This was an experiment to see if anything hid Results from mounting on load */}
        {this.state.totalTrue >= 8 && this.state.totalFalse >= 8 &&
        <div className="resultsDiv">
            <Results 
                totalTrue={this.state.totalTrue}
                totalFalse={this.state.totalFalse}
            />
        </div>
        }      
        </div>

    </div>

  </div>
   );
  }
}

export default App;

Таймер

import React, { Component } from 'react';

class Timer extends Component {

  state = {
timer: 10
  };

  startTimer = () => {
    this.timer = setInterval(() => this.setState({
    timer: this.state.timer - 1}), 1000); 
    // onClick, load Questions
    // but do I need to import Questions?
   };

  stopTimer = () => {
    clearInterval(this.timer);
    alert("Time's up!");
    // when this.state.timer === 0, load Results
    // do I need to import Results?
  };

  render() {
    return (
      <div className="Timer">
        <div>{this.state.timer} seconds</div>
        <button onClick={this.startTimer}>Start!</button>
        {this.state.timer === 0 && this.stopTimer()}
      </div>
    );
  }
}

export default Timer;

  • Вся магия происходит в методе render. В вашем случае вы должны сообщить действия от компонента Timer к вашему родительскому/контейнерному компоненту, чтобы вы могли отображать вопрос 24.12.2018

Ответы:


1

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

E.g.

{conditionToMeet &&
 <div>
    content to render here
 </div>
}
23.12.2018
  • Всем спасибо. У меня все заработало, создав дополнительные состояния в приложении, называемые showQuestions: false и showResults: false. Я создал условия для появления при начальной загрузке и использовал кнопки для их изменения с помощью условного рендеринга &&. 24.12.2018

  • 2

    вы можете проверить условие внутри метода render и отобразить нужный компонент

    render() {
      let renderedContent;
      if (condition to meet) {
          renderedContent = <Component1>
      } else if ( second condition to meet) {
         renderedContent = <Component2>
      } else { 
         renderedContent = <Component3>
      }
    
      return (
        { renderedContent }
      )
    }
    
    24.12.2018
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..