反应JS |将函数组件更改为基于类的引用错误

Posted

技术标签:

【中文标题】反应JS |将函数组件更改为基于类的引用错误【英文标题】:ReactJS | Change function Component into Class based one for ref error 【发布时间】:2019-05-26 14:27:03 【问题描述】:

我在 React 中有这个下拉函数组件。它是可重用的,它会给出这样的错误。

    Warning: Function components cannot be given refs. Attempts to access this ref will fail.

我需要将其转换为基于类的组件。但我正在撞墙。这是基于类的,低于我所做的。你能指出我的愚蠢错误吗?

    import React from 'react';
    import PropTypes from 'prop-types';
    import  toClass  from 'recompose';
    import Dropdown from 'react-bootstrap/lib/Dropdown';
    import DropdownButton from 'react-bootstrap/lib/DropdownButton';
    import SplitButton from 'react-bootstrap/lib/SplitButton';

    const  Item, Divider, Toggle, Button, Menu  = Dropdown;

    export  Item, Divider, Toggle, Button, Menu, DropdownButton, SplitButton, Dropdown ;

    const CustomDropdown = ( title, size, variant, customToggle, children, ...props ) => (
      <Dropdown ...props>
        <Toggle size=size variant=variant as=customToggle>
          title
        </Toggle>
        <Menu>children</Menu>
      </Dropdown>
    );

    CustomDropdown.defaultProps = 
      title: '',
      variant: 'primary',
      size: 'sm',
      drop: 'down',
      customToggle: toClass(props => <Toggle ...props />)
    ;

    CustomDropdown.propTypes = 
      title: PropTypes.string,
      variant: PropTypes.string,
      size: PropTypes.string,
      drop: PropTypes.string,
      customToggle: PropTypes.func
    ;

    export default CustomDropdown;

这是我的无效转换。

import React,  Component  from 'react';
import PropTypes from 'prop-types';
import  toClass  from 'recompose';
import Dropdown from 'react-bootstrap/lib/Dropdown';
import DropdownButton from 'react-bootstrap/lib/DropdownButton';
import SplitButton from 'react-bootstrap/lib/SplitButton';

export class CustomDropdown extends Component 
  static propTypes = 
    title: propTypes.string,
    variant: propTypes.string,
    size: propTypes.string,
    drop: propTypes.string,
    customToggle: propTypes.func
  ;

  static defaultProps = 
    title: '',
    variant: 'primary',
    size: 'sm',
    drop: 'down',
    customToggle: toClass(props => <Toggle ...props />)
  ;

  render() 
    const  title, size, variant, customToggle, children, ...props  = this.props;
    const  Item, Divider, Toggle, Button, Menu  = Dropdown;

    return (
      <div>
        <Dropdown ...props>
          <Toggle size=size variant=variant as=customToggle>
            title
          </Toggle>
          <Menu>children</Menu>
        </Dropdown>
      </div>
    )
  


export default CustomDropdown;

问题是目前我不使用某些命名导出以及DropdownButtonSplitButton。我广泛使用这个组件,我想停止在任何地方看到这个错误......

【问题讨论】:

【参考方案1】:

CustomDropdown 类组件只能解构在其render 方法中引用的此类属性。

const  Toggle, Menu  = Dropdown;

此外,它的propTypes 定义应导致TypeErrorsfuncstring 不是propTypes 的属性,而是PropTypes 的属性

static propTypes = 
  title: PropTypes.string,
  variant: PropTypes.string,
  size: PropTypes.string,
  drop: PropTypes.string,
  customToggle: PropTypes.func
;

【讨论】:

以上是关于反应JS |将函数组件更改为基于类的引用错误的主要内容,如果未能解决你的问题,请参考以下文章

来自 vue js 的 3 个函数错误

反应表单错误将类型文本的受控输入更改为不受控制

如何摆脱告诉我将 svg 属性更改为驼峰式大小写的反应错误警告?

如何在反应中将函数转换为基于类的组件?

Vue JS V-For 组件反应性

将 Runtime 更改为 Node.js 10 后云功能失败