我如何制作像geeksforgeeks下拉菜单这样的下拉菜单

我有一个小型的Web应用程序,当您将鼠标悬停在“ collective”一词上时,我需要显示一个下拉菜单,但是该菜单应该仍然存在,直到我单击菜单中的一个单词或将鼠标悬停在菜单外,但它会立即当我将鼠标从“ collective”一词中移出时,它消失了,甚至没有将鼠标指针移到任何下拉菜单项上。我希望我的下拉菜单像https://www.geeksforgeeks.org/

中的菜单一样 到目前为止,我的沙盒 https://codesandbox.io/s/funny-river-c76hu

要使该应用正常运行,您必须在输入框中输入“ collective”,然后单击“ analyse”,然后将显示一个进度条,单击进度条中的蓝线,在“ collective”一词下将显示一个下划线那么您应该将鼠标悬停在“集体”一词上,并显示一个下拉菜单。

import React,{ useState,useEffect } from "react";
import ReactDOM from "react-dom";
import { Content,Dropdown,Label,Progress,Button,Box } from "rbx";

import "rbx/index.css";

function App() {
  const [serverResponse,setServerResponse] = useState(null);
  const [text,setText] = useState([]);
  const [loading,setLoading] = useState(false);
  const [modifiedText,setModifiedText] = useState(null);
  const [selectedSentiment,setSentiment] = useState(null);
  const [dropdownContent,setDropdownContent] = useState([]);
  const [isCorrected,setIsCorrected] = useState(false);
  const [displayDrop,setDisplayDrop] = useState(false);
  useEffect(() => {
    if (serverResponse && selectedSentiment) {
      const newText = Object.entries(serverResponse[selectedSentiment]).map(
        ([word,recommendations]) => {
          const parts = text[0].split(word);
          const newText = [];
          parts.forEach((part,index) => {
            newText.push(part);
            if (index !== parts.length - 1) {
              newText.push(
                <u
                  classname="dropbtn"
                  data-replaces={word}
                  onmouseOver={() => {
                    setDropdownContent(recommendations);
                    setDisplayDrop(true);
                  }}
                  onmouseOut={() => setDisplayDrop(false)}
                >
                  {word}
                </u>
              );
            }
          });

          return newText;
        }
      );

      setModifiedText(newText.flat());
    }
  },[serverResponse,text,selectedSentiment]);

  const handleAnalysis = () => {
    setLoading(true);

    setTimeout(() => {
      setLoading(false);
      setServerResponse({ joy: { collective: ["inner","constant"] } });
    },1500);
  };

  const handleTextChange = event => {
    setText([event.target.innerText]);
  };

  const replaceText = wordToReplaceWith => {
    const replacedWord = Object.entries(serverResponse[selectedSentiment]).find(
      ([word,recommendations]) => recommendations.includes(wordToReplaceWith)
    )[0];

    setText([
      text[0].replace(new RegExp(replacedWord,"g"),wordToReplaceWith)
    ]);
    setModifiedText(null);
    setServerResponse(null);
    setIsCorrected(true);
    setDropdownContent([]);
  };

  const hasResponse = serverResponse !== null;

  return (
    <Box>
      <Content>
        <div
          onInput={handleTextChange}
          contentEditable={!hasResponse}
          style={{ border: "1px solid red" }}
        >
          {hasResponse && modifiedText
            ? modifiedText.map((text,index) => <span key={index}>{text}</span>)
            : isCorrected
            ? text[0]
            : ""}
        </div>
        <br />
        {displayDrop ? (
          <div
            id="myDropdown"
            class="dropdown-content"
            onClick={() => setDisplayDrop(false)}
          >
            {dropdownContent.map((content,index) => (
              <>
                <strong onClick={() => replaceText(content)} key={index}>
                  {content}
                </strong>{" "}
              </>
            ))}
          </div>
        ) : null}
        <br />
        <Button
          color="primary"
          onClick={handleAnalysis}
          disabled={loading || text.length === 0}
        >
          analyze
        </Button>
        <hr />
        {hasResponse && (
          <Label>
            Joy{" "}
            <Progress
              value={Math.random() * 100}
              color="info"
              onClick={() => setSentiment("joy")}
            />
          </Label>
        )}
      </Content>
    </Box>
  );
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />,rootElement);
wenboylqx 回答:我如何制作像geeksforgeeks下拉菜单这样的下拉菜单

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3161657.html

大家都在问