reactjs - 链接中包含的自定义 HTML 按钮不起作用

标签 reactjs button react-router next.js

我制作了一个返回 HTML button 的自定义 Button 组件。现在我在 next-routesLink 中使用这个 Button。问题是它不能以这种方式工作。奇怪的是,如果我在 Link 中使用 HTML button,按钮就会正常工作。然而,这两个按钮都以完全相同的方式在 DOM 中呈现。代码如下:

// Button.js

import React from "react";
import classNames from "classnames";

const Button = ({
    children,
    newClass = "",
    onClickHandler = () => { },
    isSubmitting = false,
    inlineBtn = true,
    disabled,
    primary,
    secondary,
    basic,
    notCentered = true,
    shaded,
    miniLoader,
    type = "button",
    isTransparent,
    fontClass = "",
    small
}) => {
    return (
        <React.Fragment>
            <button
                className={classNames(
                    `${isTransparent ? 'btn-transparent' : 'btn'} ${fontClass} ${newClass}`,
                    {
                        "btn-block": !inlineBtn,
                        "col-mx-auto": !notCentered,
                        "btn-primary": primary,
                        "btn-secondary": secondary,
                        "btn-basic": basic,
                        shaded: shaded,
                        loading: isSubmitting,
                        "loading-sm": miniLoader,
                        "btn-sm": small
                    }
                )}
                disabled={disabled}
                type={type}
                onClick={onClickHandler}
            >
                <span>{children}</span>
            </button>
        </React.Fragment>
    );
};

export { Button };

以下方法不起作用:

<Link route="/register/location">
  <Button basic small>
    Sign Up
  </Button>
</Link>

以下工作正常:

<Link route="/register/location">
  <button className="btn btn-basic btn-sm" type="button" onClick={() => { }}>
    <span>Sign Up</span>
  </button>
</Link>

最佳答案

您可以按如下方式更新您的 Button 组件。

const Button = ({
  as = "button",
  children,
  newClass = "",
  onClickHandler = () => {},
  isSubmitting = false,
  inlineBtn = true,
  disabled,
  primary,
  secondary,
  basic,
  notCentered = true,
  shaded,
  miniLoader,
  type = "button",
  isTransparent,
  fontClass = "",
  small,
  ...rest
}) => {
  const Wrapper = as;
  return (
    <Wrapper
      className={classNames(
        `${isTransparent ? "btn-transparent" : "btn"} ${fontClass} ${newClass}`,
        {
          "btn-block": !inlineBtn,
          "col-mx-auto": !notCentered,
          "btn-primary": primary,
          "btn-secondary": secondary,
          "btn-basic": basic,
          shaded: shaded,
          loading: isSubmitting,
          "loading-sm": miniLoader,
          "btn-sm": small
        }
      )}
      disabled={disabled}
      type={type}
      onClick={onClickHandler}
      {...rest}
    >
      <span>{children}</span>
    </Wrapper>
  );
};

这将允许自定义 Wrapper 用于您的 Button 组件。我们将每个继承的 Prop 传递到您的 Wrapper 中,以便您的 route Prop 将在您的 Link 组件中接收。

然后你就可以像这样使用它

<Button basic small as={Link} route="/register/location">
  Sign Up
</Button>

这使用 ES6 扩展运算符语法。基本上,您将 Button 组件渲染为 Link 组件,并且任何继承的 props 都将传递给 Link 组件,因此 route 属性被传递到 Link 组件中。

这遵循类似于 Material-ui 的 API 设计方法 spead方法。这也将使您的组件更加灵活。

关于reactjs - 链接中包含的自定义 HTML 按钮不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58832549/

相关文章:

java - 按钮仅在第二次单击时起作用

javascript - 仅在用户存在时使用 Google Auth Provider 进行身份验证

reactjs - 在 React 中对表格行的显示/隐藏进行动画处理

reactjs - 使用 React Native 检索地理位置

javascript - React 中的回调参数如何从子组件传递到父组件?

javascript - 如何在 jQuery Mobile 中更改按钮文本

python - 将一堆代码变成循环Python

javascript - 使用 CommonJS 的 react 路由器历史记录

node.js - 使用 Jest 和 Enzyme 测试 React Router

javascript - 如何在 react 应用程序中从 package.json 访问主页?