Как настроить компонент динамически, нажав кнопку. (Реагировать)

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

Пример меню

Когда я нажимаю кнопку, он устанавливает имя кнопки в качестве состояния и использует это состояние для вызова соответствующего компонента. Ниже мой код. Я хочу избавиться от «функции const dynamicComponent» и использовать что-то более простое для вызова компонента с помощью String.

Например, если я нажму кнопку displayNone и установлю состояние DisplayNone. Я хочу использовать это для вызова без отдельной функции. Это должно работать для всех разных кнопок. Есть ли способ сделать это?

Код для приложения

import {
  Sidebar,
  SidebarDemo,
  DisplayNone,
  Gsap,
  GsapScrollMagic,
  GoogleMaps,
  ClipImage,
  LinearGradient,
  ButtonActive,
  ExportFunction,
  Axios,
  Telephone,
  MailTo,
  InputSearch,
  MapFilter,
  ColumnSize,
} from "./components";

function App() {
  const [comp, setComp] = useState("");

  const handleClick = (name) => {
    setComp(name);
  };

  const dynamicComponent = () => {
    switch (comp) {
      case "DisplayNone":
        return <DisplayNone />;
      case "Gsap":
        return <Gsap />;
      case "Gsap & ScrollMagic":
        return <GsapScrollMagic />;
      case "GoogleMaps":
        return <GoogleMaps />;
      case "Clip Image":
        return <ClipImage />;
      case "Linear Gradient":
        return <LinearGradient />;
      case "Button Active":
        return <ButtonActive />;
      case "Sidebar":
        return <Sidebar />;
      case "Export Function":
        return <ExportFunction />;
      case "Axios":
        return <Axios />;
      case "Telephone":
        return <Telephone />;
      case "Mail To":
        return <MailTo />;
      case "Input Search":
        return <InputSearch />;
      case "Map & Filter & Sort & Clone":
        return <MapFilter />;
      case "Column Size":
        return <ColumnSize />;
      default:
        return <Axios />;
    }
  };

  return (
    <div className="App">
      <Container fluid className="no-padding">
        <Row>
          <Col xs={3}>
            <SidebarDemo handleClick={handleClick} />
          </Col>
          <Col className="comp no-padding">{dynamicComponent()}</Col>
        </Row>
      </Container>
    </div>
  );
}

Код для боковой панели

import React, { useState } from "react";
import Data from "../../Data.json";

const SidebarDemo = ({ handleClick }) => {
  const [clickedName, setClickedName] = useState("");
  const [query, setQuery] = useState("");

  const makeActive = (name) => {
    handleClick(name);
    setClickedName(name);
  };

  const modifiedData = Data.filter((item) => {
    return item.toLowerCase().includes(query.toLowerCase()) ? item : null;
  });

  const sortedData = modifiedData.sort((a, b) => a.localeCompare(b));

  return (
    <div className="flex-column align-items-center sidebar">
      <br />
      <h4>Damon's Library</h4>
      <br />
      <input
        type="text"
        placeholder="Search.."
        className="sidebar-input-box"
        onChange={(e) => setQuery(e.target.value)}
        value={query}
      />
      <br />
      <div className="mr-auto flex-column button-bar">
        {sortedData.map((data, i) => (
          <span
            className={"sidebar-button" + (data === clickedName ? " button-active" : "")}
            key={i}
            onClick={() => makeActive(data)}>
            {data}
          </span>
        ))}
      </div>
    </div>
  );
};

export default SidebarDemo;

Data.json содержит [Item1, Item2, Item3, ...]


person Damon    schedule 25.05.2020    source источник
comment
пожалуйста, поделитесь также кодом для SidebarDemo   -  person Vivek Doshi    schedule 25.05.2020


Ответы (1)


Одним из обходных путей может быть это,

1-й импорт всех компонентов (без деструктурирования)

import * as AllComponents from "./components";

Затем создайте новую переменную, которая извлекает точный компонент с динамическим именем,

const DynamicComponent = AllComponents[comp]

а затем визуализировать этот динамический компонент

<DynamicComponent />
person DedaDev    schedule 25.05.2020
comment
Спасибо, что поделились своими мыслями. Я решил проблему. Мне также пришлось установить регистр по умолчанию при настройке состояния для правильной работы. - person Damon; 26.05.2020