【问题标题】:How to rewrite class component to React Functional?如何将类组件重写为 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} alt="" />
          </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() 但之后我很困惑..

【问题讨论】:

    标签: reactjs react-hooks react-functional-component


    【解决方案1】:

    这应该做的工作

    1. class 替换为const
    2. 移除类组件中使用的render生命周期方法
    3. 在函数的参数中添加props
    4. 删除所有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} alt="" />
              </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>
        )
    }
    

    【讨论】:

    • 很好,但你忘了销毁道具。
    猜你喜欢
    • 1970-01-01
    • 2023-01-31
    • 1970-01-01
    • 2020-09-23
    • 2021-08-17
    • 2020-11-19
    • 2021-06-09
    • 2021-09-16
    • 1970-01-01
    相关资源
    最近更新 更多