【问题标题】:onClick event fires infinite when passing a parameter传递参数时,onClick 事件会无限触发
【发布时间】:2020-04-23 05:22:08
【问题描述】:

我已经制作了我的第一个组件。目标是创建一个简单的下拉菜单。每次我添加参数时,都会无限触发点击事件:

onClick={dropDownChanged(10)}

如果我像下面这样调用它,则单击时会触发该事件,但是我没有得到所需的值:

onClick={dropDownChanged}

如何传递我的值,以便使用所选值更新下拉列表?我也尝试不使用箭头函数,而是使用相同的行为。

import React, { useState } from "react";
import {
  Dropdown,
  DropdownToggle,
  DropdownMenu,
  DropdownItem,
  Button
} from "reactstrap";

const DropdownPaging = props => {
  const [dropdownOpen, setDropdownOpen] = useState(false);
  const toggle = () => setDropdownOpen(prevState => !prevState);

  const dropDownChanged = val => {
    alert("ff");
  };

  return (
    <div>
      <table>
        <tr>
          <td>
            <Button outline color="dark">
              &lt;
            </Button>
          </td>
          <td>
            <Button outline color="dark">
              &gt;
            </Button>
          </td>
          <td>
            <Dropdown isOpen={dropdownOpen} toggle={toggle}>
              <DropdownToggle caret outline color="dark">
                10
              </DropdownToggle>
              <DropdownMenu>
                <DropdownItem onClick={dropDownChanged}>10</DropdownItem>
                <DropdownItem onClick={dropDownChanged}>25</DropdownItem>
                <DropdownItem onClick={dropDownChanged}>50</DropdownItem>
                <DropdownItem onClick={dropDownChanged}>100</DropdownItem>
              </DropdownMenu>
            </Dropdown>
          </td>
        </tr>
      </table>
    </div>
  );
};

export default DropdownPaging;

【问题讨论】:

    标签: reactjs reactstrap


    【解决方案1】:

    像这样传入函数

    onClick={() => dropDownChanged(10)}
    

    【讨论】:

    • 工作感谢。我会尽可能标记为答案。
    • 没问题,要进一步阅读,请查看 React 文档,了解它涵盖这些情况以及优缺点的功能:reactjs.org/docs/faq-functions.html
    • 我按照文章把箭头功能改成了普通功能。我参加了有关复数视觉的课程,该课程指出制作组件几乎总是应该是函数而不是类。然而,网上的大多数样本都是类。
    • 这取决于您的建筑以及示例的新程度。目前维护三个 React 应用程序,几乎所有这些应用程序都使用函数,因为我们已经拿起了钩子并使用它运行。函数或类没有对错,但 React 文档确实说明了新项目尝试在类上使用函数和钩子。
    • 它确实会影响性能,是的,但影响不大,有时当您需要传递参数时,它是您唯一的选择。正如文档所说,如果您尝试通过严格的身份比较来提高性能或提高性能,您可能需要尝试其他方法,但在大多数情况下都可以。
    【解决方案2】:

    把它当做是有区别的

    onClick={ dropDownChanged(10) }

    onClick={ dropDownChanged }

    案例 1: 运行该部分代码后,代码立即调用该函数。 IE。渲染组件时,会自动调用该函数,从而导致意外行为。

    案例 2: 函数作为引用传递。这是将函数传递给单击处理程序的正确方法,但是单击按钮时将调用它。但是这种方法的问题是我们在调用函数时无法发送值。

    此用例中的理想解决方案是将回调函数传递给事件处理程序。

    即。 onClick={() =&gt; dropDownChanged(10)}

    当按钮被点击时,它又会调用回调函数并按预期工作。希望这可以澄清事件处理程序的行为!

    【讨论】:

    • 谢谢。亚历山大的回答要快一些,但非常感谢您的意见。赞赏。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-18
    • 2017-02-03
    • 2012-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多