下拉菜单中未触发点击事件

时间:2020-01-22 18:02:21

标签: reactjs reactstrap

创建了一个工作样本: https://codesandbox.io/s/collapse-gmqpp

问题是我有地图功能,所以有多个下拉菜单。所以我需要处理多个状态。每个下拉菜单一个。因此,我最终在可以打开的媒体对象上添加了一个属性。谢谢大家的投入。

我有一个非常奇怪的问题,希望当我刚接触REACT时有人可以提供帮助。我知道这是一大段代码,但是下面是问题的摘要。包裹在div中的DropDown标记之外的单击事件有效。但是,下拉列表中的点击事件不起作用吗?他们根本没有被解雇。

<div> THIS WORKS!
  <DropdownItem
    onClick={() => toggleCrawlResultModal("")}
  >
    Result
  </DropdownItem>
  <DropdownItem onClick={() => alert("dd")}>
    Analytics
  </DropdownItem>
  <DropdownItem onClick={toggleAIModal}>
    Insights
  </DropdownItem>
  <DropdownItem onClick={toggleDetails}>
    Details
  </DropdownItem>
</div>

 CLICK EVENTS BELOW DOES NOT WORK
<Dropdown toggle={toggleMenu} isOpen={dropdownOpen}>
  <DropdownToggle tag="div">
    &bull;&bull;&bull;
  </DropdownToggle>
  <DropdownMenu>
    <DropdownItem
      onClick={() => toggleCrawlResultModal("")}
    >
      Result
    </DropdownItem>
    <DropdownItem onClick={() => alert("dd")}>
      Analytics
    </DropdownItem>
    <DropdownItem onClick={toggleAIModal}>
      Insights
    </DropdownItem>
    <DropdownItem onClick={toggleDetails}>
      Details
    </DropdownItem>
  </DropdownMenu>
</Dropdown>

如果我将下拉菜单中的事件更改为使用箭头功能,则事件起作用。但是,然后它们会在页面加载时触发,而不是在单击切换按钮时触发:

<Dropdown toggle={() => toggleMenu()} isOpen={() => dropdownOpen()}>

更多测试: 如果我执行以下操作,则下拉列表始终会扩展:

<Dropdown isOpen={true}>

就像我这样做的方式一样,在dropdown元素内的子元素之间切换eat的所有事件。

我成功地在codeandbox上制作了一个非常糟糕的示例。单击三个点,然后单击结果按钮。它具有相同的行为:

https://codesandbox.io/s/collapse-gmqpp?fontsize=14&hidenavigation=1&theme=dark

完整代码:

import React, { useState, useEffect } from "react";
import DropdownPaging from "./DropdownPaging";
import TimeBar from "./TimeBar";
import { CrawlService } from "../../services/CrawlService";
import {
  Card,
  CardBody,
  CardHeader,
  Collapse,
  Fade,
  Row,
  Col,
  InputGroup,
  InputGroupAddon,
  Button,
  Input,
  DropdownItem,
  DropdownMenu,
  Dropdown,
  DropdownToggle,
  Modal,
  ModalBody,
  ModalHeader
} from "reactstrap";

const CrawlJobs = () => {
  const [debug, setDebug] = useState(true);

  const [timeout] = useState(300);
  const [fadeIn] = useState(true);
  const [dropdownOpen, setDropdownOpen] = useState(false);
  const [showCrawlResultModal, setShowCrawlResultModal] = useState(false);
  const [showAnalyticsModal, setShowAnalyticsModal] = useState(false);
  const [showAIModal, setShowAIModal] = useState(false);
  const [showDetailsModal, setShowDetailsModal] = useState(false);
  const [mediaList, setMediaList] = useState([]);

  const [tester, setTester] = useState(false);

  const [pageInfo, setPageInfo] = useState({
    minutes: 10,
    pageIndex: 0,
    pageSize: 10
  });

  useEffect(() => {
    const fetchMediaData = async () => {
      try {
        var mediaResult = await CrawlService.getJobs();
        setMediaList(mediaResult.data);
      } catch (error) {}
    };
    fetchMediaData();
  }, []);

  const getMediaIcon = mediaName => {
    switch (mediaName) {
      case "Facebook":
        return "fa fa-facebook-square fa-2x";
      case "Youtube":
        return "fa fa-youtube-square fa-2x";
      case "Twitter":
        return "fa fa-twitter-square fa-2x";
      case "Instagram":
        return "fa fa-instagram fa-2x";

      default:
        return null;
    }
  };

  const pagerValueChanged = val => {
    setPageInfo({
      pageIndex: val.pageIndex,
      pageSize: val.take,
      minutes: pageInfo.minutes
    });
    setDebug(val.take + ", " + val.pageIndex);
  };

  const toggleDetails = e => {
    setShowDetailsModal(!showDetailsModal);
  };
  const toggleAIModal = e => {
    setShowAIModal(!showAIModal);
  };

  const toggleAnalyticsModal = e => {
    setShowAnalyticsModal(!showAnalyticsModal);
  };

  const toggleCrawlResultModal = e => {
    alert("fff");
    setShowCrawlResultModal(!showCrawlResultModal);
  };

  const toggleMenu = e => {
    setDropdownOpen(!dropdownOpen);
  };

  const test = () => {
    alert(
      "minutes:" +
        pageInfo.minutes +
        ", pageIndex:" +
        pageInfo.pageIndex +
        ", pageSize:" +
        pageInfo.pageSize
    );
  };

  const toggle = media => {
    setMediaList(
      mediaList.map(m => {
        return m.typeId === media.typeId ? { ...m, toggle: !m.toggle } : m;
      })
    );
  };

  const loadJobsTable = media => {};

  const minutesChanged = val => {
    setPageInfo({ minutes: val });
  };

  return (
    <div className="animated fadeIn">
      <Row style={{ marginBottom: 10 }}>
        <button onClick={test}>TEST</button>
        <Col xs="6" sm="6" md="6">
          <TimeBar onClick={minutesChanged}></TimeBar>
        </Col>
      </Row>

      <Row>
        <Col xs="4" sm="4" md="4">
          <InputGroup>
            <InputGroupAddon addonType="prepend">
              <Button type="button" color="secondary">
                <i className="fa fa-search"></i>
              </Button>
            </InputGroupAddon>
            <Input
              type="text"
              id="input1-group2"
              name="input1-group2"
              placeholder="Tag or profile name"
            />
          </InputGroup>
        </Col>
      </Row>

      <h2>Profiles</h2>

      {mediaList.map(media => (
        <Row key={media.typeId}>
          <Col xs="12" sm="12" md="12">
            <Fade timeout={timeout} in={fadeIn}>
              <Card>
                <CardHeader style={{ padding: 0, borderBottomWidth: 0 }}>
                  <table
                    className="table table-borderless"
                    style={{ marginBottom: 0, padding: 0 }}
                  >
                    <tbody>
                      <tr>
                        <td className="align-middle" style={{ width: 50 }}>
                          <i className={getMediaIcon(media.name)}></i>
                        </td>

                        {media.statusList.map(status => (
                          <td key={"statusTD" + status.statusId}>
                            <button
                              className="btn btn-outline-dark btn-block"
                              onClick={() => toggle(media)}
                            >
                              {status.name} ({status.count})
                            </button>
                          </td>
                        ))}
                      </tr>
                    </tbody>
                  </table>
                </CardHeader>
                <Collapse isOpen={media.toggle} id="collapseExample">
                  <CardBody>
                    <table className="table table-responsive-sm table-striped">
                      <thead>
                        <tr>
                          <th>Username</th>
                          <th>Date registered</th>
                          <th>Role</th>
                          <th></th>
                        </tr>
                      </thead>
                      <tbody>
                        <tr>
                          <td>Yiorgos Avraamu</td>
                          <td>2012/01/01</td>
                          <td>Member</td>
                          <td style={{ width: 20, cursor: "pointer" }}>
                            <div>
                              <DropdownItem
                                onClick={() => toggleCrawlResultModal("")}
                              >
                                Result
                              </DropdownItem>
                              <DropdownItem onClick={() => alert("dd")}>
                                Analytics
                              </DropdownItem>
                              <DropdownItem onClick={toggleAIModal}>
                                Insights
                              </DropdownItem>
                              <DropdownItem onClick={toggleDetails}>
                                Details
                              </DropdownItem>
                            </div>

                            <Dropdown toggle={toggleMenu} isOpen={dropdownOpen}>
                              <DropdownToggle tag="div">
                                &bull;&bull;&bull;
                              </DropdownToggle>
                              <DropdownMenu>
                                <DropdownItem
                                  onClick={() => toggleCrawlResultModal("")}
                                >
                                  Result
                                </DropdownItem>
                                <DropdownItem onClick={() => alert("dd")}>
                                  Analytics
                                </DropdownItem>
                                <DropdownItem onClick={toggleAIModal}>
                                  Insights
                                </DropdownItem>
                                <DropdownItem onClick={toggleDetails}>
                                  Details
                                </DropdownItem>
                              </DropdownMenu>
                            </Dropdown>
                          </td>
                        </tr>
                        <tr>
                          <td>Avram Tarasios</td>
                          <td>2012/02/01</td>
                          <td>Staff</td>
                          <td>&bull;&bull;&bull;</td>
                        </tr>
                        <tr>
                          <td>Quintin Ed</td>
                          <td>2012/02/01</td>
                          <td>Admin</td>
                          <td>&bull;&bull;&bull;</td>
                        </tr>
                        <tr>
                          <td>Enéas Kwadwo</td>
                          <td>2012/03/01</td>
                          <td>Member</td>
                          <td>&bull;&bull;&bull;</td>
                        </tr>
                        <tr>
                          <td>Agapetus Tadeáš</td>
                          <td>2012/01/21</td>
                          <td>Staff</td>
                          <td>&bull;&bull;&bull;</td>
                        </tr>
                      </tbody>
                    </table>

                    <div>
                      <p>{debug}</p>
                      <DropdownPaging
                        valueChanged={pagerValueChanged}
                      ></DropdownPaging>
                    </div>
                  </CardBody>
                </Collapse>
              </Card>
            </Fade>
          </Col>
        </Row>
      ))}

      <h2>Tags</h2>

      <div>
        <Modal
          isOpen={showCrawlResultModal}
          toggle={toggleCrawlResultModal}
          size="lg"
        >
          <ModalHeader toggle={toggleCrawlResultModal}>
            Crawl Result
          </ModalHeader>
          <ModalBody>TBD</ModalBody>
        </Modal>
        <Modal isOpen={showAIModal} toggle={toggleAIModal} size="lg">
          <ModalHeader toggle={toggleAIModal}>Insights</ModalHeader>
          <ModalBody>TBD</ModalBody>
        </Modal>
        <Modal
          isOpen={showAnalyticsModal}
          toggle={toggleAnalyticsModal}
          size="lg"
        >
          <ModalHeader toggle={toggleAnalyticsModal}>Analytics</ModalHeader>
          <ModalBody>TBD</ModalBody>
        </Modal>
        <Modal isOpen={showDetailsModal} toggle={toggleDetails} size="lg">
          <ModalHeader toggle={toggleDetails}>Details</ModalHeader>
          <ModalBody>TBD</ModalBody>
        </Modal>
      </div>
    </div>
  );
};

export default CrawlJobs;

0 个答案:

没有答案