React - 收到非布尔属性的“false”'attrName'

React - Received `false` for a non-boolean attribute 'attrName'

我有自己的可重用 Button 组件,代码如下:

import React, {Component} from 'react';
import PropTypes from 'prop-types';

class Button extends Component {
    render() {
        const {href, border, children, className} = this.props;
        let baseClass = 'button';
        border && (baseClass += ' button-border');
        className && (baseClass += ' ' + className);
        return (
            href ? (
                    <a className={baseClass} {...this.props}><span>{children}</span></a>
                ) :
                (
                    <button {...this.props} className={baseClass}><span>{children}</span></button>
                )
        )
    }
}

Button.propTypes = {
    href: PropTypes.string,
    border: PropTypes.bool,
    className: PropTypes.string
}

Button.defaultProps = {
    border: false,
    className: ''
}

export default Button;

然后我在没有 border 属性的其他组件中调用它,因为我通常只将它用于辅助类型的操作调用(请记住,代码被简化只是为了说明问题,所以传递一个额外的className 为了避免警告不是一个可行的解决方案)。

我使用以下代码调用按钮:

<Button>Continue</Button>

如您所见,没有指定边框属性,因此组件从 defaultProps 接收到正确的值:false。

不幸的是,在 运行 我的申请之后,我遇到了以下警告: react-dom.development.js:506 警告:收到 false 非布尔属性 border.

我已经阅读了多个具有类似问题的其他问题,但其中 none 很有帮助。

在我的实现中我也尝试修改了

border && (baseClass += ' button-border');

border ? (baseClass += ' button-border') : '';

但没有解决任何问题。

我还在组件渲染之前将 Button.propTypes 移动到静态 propTypes - 没有任何结果。

就软件包而言,我使用的是: - 反应 16.8.2 - 道具类型 15.7.2

感谢您提供这方面的线索。

组件本身的定义没有任何问题(即 defaultProps<Button /> 上的 propTypes),但是这是由于以下代码导致的,它传递给<a/><button/>

{...this.props}

通过这样做,我们将 border={false} 传递给本机锚点和按钮元素,这似乎不受支持,或者至少会引发 React 的错误。如果删除这些行,您会注意到错误消失了;明确地将您想要的道具传递给这些标签可能是值得的。