Как визуализировать различные компоненты onClick? (Компонент должен быть заменен новейшим обработчиком щелчка.)

Я пытаюсь отобразить разные компоненты на основе текста на панели навигации, на который я нажимаю. Рендеринг компонента заменит текущий. У меня есть 5 элементов onclick, которые я хочу использовать и отображать 5 различных компонентов по требованию. Пожалуйста помоги!!

import Sidenav from "./components/ButtonAppBar";
import AboutTab from "./components/About";
import QuoteTab from "./components/Quote";
import ProductTab from "./components/Quote";
import CalendarTab from "./components/Quote";
import ContactTab from "./components/Quote";
import "./App.css";


class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      component: "About"
    };
  }

  var component = this.state.component;

switch(component) {
  case "Contact":
    return <ContactTab />;
    break;
  case "Quote":
    return <QuoteTab />;
    break;
  default:
    return <AboutTab />;
}

  render() {
    return (
      <div>
        <Sidenav>
          <h1 className = "navlink" onClick = {this.getComponent}>
            About
          </h1>
          <h1 className = "navlink" onClick = {this.getComponent}>
            Quote
          </h1>
          <h1 className = "navlink" onClick = {this.getComponent}>
            Schedule
          </h1>
          <h1 className = "navlink" onClick = {this.getComponent}>
            Products
          </h1>
        </Sidenav>
        <AboutTab />
        <QuoteTab />
      </div>
    );
  }
}

export default App;

До сих пор я застрял и не могу заставить что-либо работать.

Поведение ключевого слова "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
23
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

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

import Sidenav from "./components/ButtonAppBar";
import AboutTab from "./components/About";
import QuoteTab from "./components/Quote";
import ProductTab from "./components/Quote";
import CalendarTab from "./components/Quote";
import ContactTab from "./components/Quote";
import "./App.css";


class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      component: "About"
        };
        this.getComponent = this.getComponent.bind(this);
    }

    getComponent(event) {
        this.setState({ component: event.target.textContent })
    }

  render() {
    const component = this.state.component;
    let renderComponent = null; // declare a null variable that will contain the component

    switch(component) {
        case "Contact":
            renderComponent = <ContactTab />;
            break;
        case "Quote":
            renderComponent = <QuoteTab />;
            break;
        default:
            renderComponent = <AboutTab />;
    }

    return (
      <div>
        <Sidenav>
          <h1 className = "navlink" onClick = {this.getComponent}>
            About
          </h1>
          <h1 className = "navlink" onClick = {this.getComponent}>
            Quote
          </h1>
          <h1 className = "navlink" onClick = {this.getComponent}>
            Schedule
          </h1>
          <h1 className = "navlink" onClick = {this.getComponent}>
            Products
          </h1>
        </Sidenav>

        {/* Use the variable here */}
        {renderComponent} 

      </div>
    );
  }
}

export default App;

Если ваша навигация имеет элементы, отличные от текста, она не будет работать. Рассмотрите возможность использования функции onClick, дающей параметр с именем компонента:

<h1 className = "navlink" onClick = {() => this.getComponent('About')}>
    {/* Won't work with the previous example, as it contains another html element */}
    <i className='fa fa-info' /> About
</h1>

а затем в функции getComponent:

getComponent(componentName) {
    this.setState({ component: componentName })
}

Подумайте также о том, чтобы дать функции более описательное имя, чтобы было легче понять, что она делает (установив имя компонента в состояние):

setViewComponentName(componentName) {
    this.setState({ component: componentName })
}

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