首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >要根据按钮呈现组件

要根据按钮呈现组件
EN

Stack Overflow用户
提问于 2022-11-01 17:36:12
回答 1查看 39关注 0票数 -1

我想根据输入呈现组件。这里我做了一个函数,根据输入返回组件,但它没有显示任何东西,我使用ant framework.This是排序可视化代码。首先,我展示了排序可视化器,然后介绍了算法及其时间复杂度和空间复杂度。我不想创建新的页面,而是呈现一个根据输入进行更改的组件。我的逻辑很酷,但什么也没有显示出来。

代码语言:javascript
复制
import React, { useState } from 'react';
import selectionSort from '../../algorithms/selection-sort';
import generateRandomizedArray from '../../helpers/randomizeArray';
import SortingBar from '../SortingBar/SortingBar';
import HomeHeader from '../HomeHeader/HomeHeader';
import '../../index.css';
import bubbleSort from '../../algorithms/bubble-sort';
import insertionSort from '../../algorithms/insertion-sort';
import mergeSortWrapper from '../../algorithms/merge-sort';
import quickSortLWrapper from '../../algorithms/quick-sort-l';
import countingSort from '../../algorithms/counting-sort';
import radixSort from '../../algorithms/radix-sort';
import heapSort from '../../algorithms/heap-sort';
import CodeEditor from '../CodeEdior/CodeEditor';
import {Routes,Route} from 'react-router-dom';

const Home = () => {
  const arraySize = 100;
  const [isVisualizing, setIsVisualizing] = useState(false);
  const [randomizedArray, setRandomizedArray] = useState(
    generateRandomizedArray({ arraySize: arraySize })
  );
  const [colorsArray, setColorsArray] = useState(
    new Array(randomizedArray.length).fill(0)
  );
  const [visualizationSpeed, setVisualizationSpeed] = useState(30);
  const [maxItem, setMaxItem] = useState(Math.max(...randomizedArray));
  const [currentAlgorithm, setCurrentAlgorithm] = useState('Bubble Sort');
  const algorithms = [
    'Bubble Sort',
    'Insertion Sort',
    'Selection Sort',
    'QuickSort',
    'Merge Sort',
    'Counting Sort',
    'Radix Sort',
    'Heap Sort'
  ];

  const codeEditor = ({algo}) => {
    switch(algo){
      case"Bubble Sort":
        return <CodeEditor/>
      default:
        break;
    }
  }

  const onRandomize = () => {
    if (isVisualizing) return;
    const nextRandomizedArray = generateRandomizedArray({
      arraySize: randomizedArray.length,
    });
    setRandomizedArray(nextRandomizedArray);
    setMaxItem(Math.max(...nextRandomizedArray));
  };
  const onInputSizeChanged = (val) => {
    if (isVisualizing) return;
    const nextRandomizedArray = generateRandomizedArray({ arraySize: val });
    setRandomizedArray(nextRandomizedArray);
    setMaxItem(Math.max(...nextRandomizedArray));
    setColorsArray(new Array(nextRandomizedArray.length).fill(0));
  };
  const onSpeedChange = (val) => {
    if (isVisualizing) return;
    setVisualizationSpeed(100 - val + 1);
  };

  const onVisualize = async () => {
    if (isVisualizing) return;

    setIsVisualizing(true);
    switch (currentAlgorithm) {
      case 'Selection Sort':
        await selectionSort({
          array: randomizedArray,
          setArray: setRandomizedArray,
          visualizationSpeed: visualizationSpeed,
          setColorsArray: setColorsArray,
        });
        break;

      case 'Bubble Sort':
        await bubbleSort({
          array: randomizedArray,
          setArray: setRandomizedArray,
          visualizationSpeed: visualizationSpeed,
          setColorsArray: setColorsArray,
        });
        break;

      case 'Insertion Sort':
        await insertionSort({
          array: randomizedArray,
          setArray: setRandomizedArray,
          visualizationSpeed: visualizationSpeed,
          setColorsArray: setColorsArray,
        });
        break;

      case 'QuickSort':
        await quickSortLWrapper({
          array: randomizedArray,
          leftIndex: 0,
          rightIndex: randomizedArray.length - 1,
          setArray: setRandomizedArray,
          visualizationSpeed: visualizationSpeed,
          setColorsArray: setColorsArray,
        });
        break;
      
      case 'Merge Sort':
        await mergeSortWrapper({
          array: randomizedArray,
          leftIndex: 0,
          rightIndex: randomizedArray.length - 1,
          setArray: setRandomizedArray,
          visualizationSpeed: visualizationSpeed,
          setColorsArray: setColorsArray,
        });
        break;
      case 'Counting Sort':
        await countingSort({
          array:randomizedArray,
          setArray:setRandomizedArray,
          visualizationSpeed:visualizationSpeed,
          setColorsArray:setColorsArray
        });
        break;
        case 'Radix Sort':
        await radixSort({
          array:randomizedArray,
          setArray:setRandomizedArray,
          visualizationSpeed:visualizationSpeed,
          setColorsArray:setColorsArray
        });
        break;
        case 'Heap Sort':
        await heapSort({
          array:randomizedArray,
          setArray:setRandomizedArray,
          visualizationSpeed:visualizationSpeed,
          setColorsArray:setColorsArray
        });
        break;

      default:
        break;
    }

    setIsVisualizing(false);
  };

  return (
    <div style={{ display: 'flex', flexDirection: 'column', height: '100vh' }}>
      <HomeHeader
        algorithms={algorithms}
        onAlgorithmChange={setCurrentAlgorithm}
        currentAlgorithm={currentAlgorithm}
        onRandomize={onRandomize}
        onInputSizeChanged={onInputSizeChanged}
        onSpeedChange={onSpeedChange}
        onStart={onVisualize}
        isVisualizing={isVisualizing}
      />
      <div
        style={{
          backgroundColor: '#0D1929',
          display: 'flex',
          height: '100%',
          width: '100vw',
          flexDirection: 'row',
          alignItems: 'end',
          padding: '0px 0px 0px 0px',
        }}
      >
        {randomizedArray.map((item, index) => {
          const height = (item / maxItem) * 100;
          const width = (1 / randomizedArray.length) * 100;
          return (
            <div
              key={index}
              style={{
                height: '100%',
                display: 'flex',
                alignItems: 'end',
                width: `${width}%`,
              }}
            >
              <SortingBar
                colorCode={colorsArray[index]}
                style={{
                  height: `calc(${height}% - 20px)`,
                  width: '100%',
                  margin: 'auto 10% 0 10%',
                }}
              ></SortingBar>
            </div>
          );
        })}
        { codeEditor(currentAlgorithm)}
        {/* insert here */}
      </div>
    </div>
  );
};

export default Home;

这是我的codeEditor组件

代码语言:javascript
复制
import { Collapse, Space } from 'antd';
import React from 'react';
const { Panel } = Collapse;
const text = `
  A dog is a type of domesticated animal.
  Known for its loyalty and faithfulness,
  it can be found as a welcome guest in many households across the world.
`;
export default function CodeEditor() {
  return (
    <Space direction="vertical" style={{marginLeft:'auto', marginRight:'auto', marginTop:'20px',marginDown:'20px'}}>
    <Collapse collapsible="icon" defaultActiveKey={['1']}>
      <Panel header="This panel can only be collapsed by clicking icon" key="1">
        <p>{text}</p>
      </Panel>
    </Collapse>
  </Space>
  )
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-01 17:41:32

您的代码中有两个问题:

  1. --尽管它是一个字符串,但试图对状态(currentAlgorithm)进行重构。
  2. --您不返回呈现的组件.

注意:您不需要在break语句之后使用return

代码语言:javascript
复制
const { useState } = React;

const CodeEditor = () => '<CodeEditor/>';

// don't destructure algo
const codeEditor = (algo) => {
  switch(algo){
    case"Bubble Sort":
      return <CodeEditor/> // return 
    default:
      break;
  }
}

const Demo = () => {
  const [currentAlgorithm, setCurrentAlgorithm] = useState('Bubble Sort');
  return (
    <div>
    {codeEditor(currentAlgorithm)}
    </div>
  );
}

ReactDOM
  .createRoot(root)
  .render(<Demo />);
代码语言:javascript
复制
<script crossorigin src="https://unpkg.com/react@18/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>

<div id="root"></div>

另一种选择是将codeEditor转换为组件(EditorSelector),并将其呈现为标准组件,并通过选择器传递道具:

代码语言:javascript
复制
const { useState } = React;

const CodeEditor = ({ val }) => (
  <div>
    value: {val}
  </div>
);

const EditorSelector = ({ algo, ...props }) => {
  console.log(algo);
  switch(algo){
    case"Bubble Sort":
      return <CodeEditor {...props} />;
    default:
      return null;
  }
}

const Demo = () => {
  const [currentAlgorithm, setCurrentAlgorithm] = useState('Bubble Sort');
  return (
    <div>
      <EditorSelector algo={currentAlgorithm} val={1} />
    </div>
  );
}

ReactDOM
  .createRoot(root)
  .render(<Demo />);
代码语言:javascript
复制
<script crossorigin src="https://unpkg.com/react@18/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>

<div id="root"></div>

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74279740

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档