链接中包含的自定义HTML按钮无法正常运行

我已经制作了一个自定义Button组件,该组件返回HTML button。现在,我正在Button的{​​{1}}内部使用此Link。问题在于它不能以这种方式工作。奇怪的是,如果我在next-routes内使用HTML button,则按钮可以正常工作。但是,两个按钮都以完全相同的方式在DOM中呈现。以下是代码:

Link

以下内容无效:

// 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>
zhichaoc21614879 回答:链接中包含的自定义HTML按钮无法正常运行

您可以按以下方式更新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组件。我们会将所有继承的道具传递到您的Wrapper中,以便您的route道具将被接收到您的Link组件中。

然后您可以像这样使用它

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

这使用ES6扩展运算符语法。基本上,您将Button组件as渲染为Link组件,所有继承的道具都会传递到Link组件,因此route道具会传递到{ {1}}组件。

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

本文链接:https://www.f2er.com/3111976.html

大家都在问