如何将类组件重写为 React Functional?

Posted

技术标签:

【中文标题】如何将类组件重写为 React Functional?【英文标题】:How to rewrite class component to React Functional? 【发布时间】:2021-09-01 03:12:33 【问题描述】:

我是 React 新手,正在学习基础知识,但现在我需要重写一个 Class 组件才能使用 React Hooks。所以我想我需要将它重写为一个功能组件。

我已经尝试改变一些东西,但最后一切都坏了,我会得到一个“未定义的道具”错误。

这是代码:

class Main extends React.Component 
  render() 
    let close = (
      <div
        className="close"
        onClick=() => 
          this.props.onCloseArticle()
        
      ></div>
    )

    return (
      <div
        ref=this.props.setWrapperRef
        id="main"
        style=this.props.timeout ?  display: 'flex'  :  display: 'none' 
      >
        <article
          id="vision"
          className=`$this.props.article === 'vision' ? 'active' : '' $
            this.props.articleTimeout ? 'timeout' : ''
          `
          style= display: 'none' 
        >
          <h2 className="major">Vision</h2>
          <span className="image main">
            <img src=pic01  />
          </span>
          <p>
            Adipiscing magna sed dolor elit. Praesent eleifend dignissim arcu,
            at eleifend sapien imperdiet ac. Aliquam erat volutpat. Praesent
            urna nisi, fringila lorem et vehicula lacinia quam. Integer
            sollicitudin mauris nec lorem luctus ultrices.
          </p>
          <p>
            Nullam et orci eu lorem consequat tincidunt vivamus et sagittis
            libero. Mauris aliquet magna magna sed nunc rhoncus pharetra.
            Pellentesque condimentum sem. In efficitur ligula tate urna.
            Maecenas laoreet massa vel lacinia pellentesque lorem ipsum dolor.
            Nullam et orci eu lorem consequat tincidunt. Vivamus et sagittis
            libero. Mauris aliquet magna magna sed nunc rhoncus amet feugiat
            tempus.
          </p>
          close
        </article>
      </div>
    )
  


Main.propTypes = 
  route: PropTypes.object,
  article: PropTypes.string,
  articleTimeout: PropTypes.bool,
  onCloseArticle: PropTypes.func,
  timeout: PropTypes.bool,
  setWrapperRef: PropTypes.func.isRequired,


export default Main

我所做的是将class main 更改为const Main = () =&gt; ,删除render() 但之后我很困惑..

【问题讨论】:

【参考方案1】:

这应该做的工作

    class 替换为const 移除类组件中使用的render生命周期方法 在函数的参数中添加props 删除所有this
const Main = (props) => 
    let close = (
      <div
        className="close"
        onClick=() => 
          props.onCloseArticle()
        
      ></div>
    )

    return (
      <div
        ref=props.setWrapperRef
        id="main"
        style=props.timeout ?  display: 'flex'  :  display: 'none' 
      >
        <article
          id="vision"
          className=`$props.article === 'vision' ? 'active' : '' $
            props.articleTimeout ? 'timeout' : ''
          `
          style= display: 'none' 
        >
          <h2 className="major">Vision</h2>
          <span className="image main">
            <img src=pic01  />
          </span>
          <p>
            Adipiscing magna sed dolor elit. Praesent eleifend dignissim arcu,
            at eleifend sapien imperdiet ac. Aliquam erat volutpat. Praesent
            urna nisi, fringila lorem et vehicula lacinia quam. Integer
            sollicitudin mauris nec lorem luctus ultrices.
          </p>
          <p>
            Nullam et orci eu lorem consequat tincidunt vivamus et sagittis
            libero. Mauris aliquet magna magna sed nunc rhoncus pharetra.
            Pellentesque condimentum sem. In efficitur ligula tate urna.
            Maecenas laoreet massa vel lacinia pellentesque lorem ipsum dolor.
            Nullam et orci eu lorem consequat tincidunt. Vivamus et sagittis
            libero. Mauris aliquet magna magna sed nunc rhoncus amet feugiat
            tempus.
          </p>
          close
        </article>
      </div>
    )

【讨论】:

很好,但你忘了销毁道具。

以上是关于如何将类组件重写为 React Functional?的主要内容,如果未能解决你的问题,请参考以下文章

React将类组件转换为功能组件不起作用

如何将类组件转换为功能组件?

将类重构为 React 中的功能组件

将类组件转换为功能组件

从 REACT 17 中文件 functionComponentA 中的函数组件 B 中的文件 fileA 中的类组件 ClassComponentA 调用名为 functionA 的函数

如果li在react功能组件中具有活动类,如何将类添加到父元素ul