将'Const'ReactJs组件转换为基于param的类

时间:2017-12-14 11:23:18

标签: javascript reactjs class components

我一直在改进我正在学习使用基于类的组件的代码。对于没有参数的函数我获得了部分成功。但其余的都未转换。

什么有效:

const About = () => (
  <div>
    <h2>About</h2>
  </div>
)

class About extends React.Component {
  render() {
    return (
      <div>
         <h2>About</h2>
         <p>The content is here.</p>
       </div>
    );
  }
}

尚待完成:

下面的组件是卡住的地方。我真的无法理解这个参数如何传递给基于类的方法。 params可以在类的构造函数中作为prop或者其他东西使用吗?

const Topic = ({match}) => (
  <div>
    <h3>{match.params.topicId}</h3>
  </div>
) 

下面还有一个。

const Topics = ({match}) => (
  <div>
    <h2>Topics</h2>
    <ul>
      <li>
        <Link to={`${match.url}/rendering`}>
          Rendering with React
        </Link>
      </li>
      <li>
        <Link to={`${match.url}/components`}>
          Components
        </Link>
      </li>
      <li>
        <Link to={`${match.url}/props-v-state`}>
          Props v. State
        </Link>
      </li>
    </ul>

    <Route path={`${match.url}/:topicId`} component={Topic}/>
    <Route exact path={match.url} render={() => (
    <h3>Please select a topic.</h3>
  )}/>
  </div>
)

2 个答案:

答案 0 :(得分:4)

要从功能组件转换为类组件:

  1. 将所有内容从函数组件的主体移动到类组件的render方法。如果正文是JSX本身,则只需return方法中的render
  2. 通过解构this.props来分配您需要的道具。
  3. 注意:对于仅查看没有状态或需要生命周期方法的组件,您应该保留无状态组件。

    之前的主题:

    const Topic = ({match}) => (
      <div>
        <h3>{match.params.topicId}</h3>
      </div>
    ) 
    

    转换后的主题:

    class Topic extends React.Component {
      render() {
        const { match } = this.props;
    
        return (
          <div>
            <h3>{match.params.topicId}</h3>
          </div>
        );
      }
    }
    

答案 1 :(得分:1)

为了扩展Ori Drori的解决方案(这是完全正确的)我想给你一些组件组成的更多上下文来理解道具的来源(尚未回答)。

所以,让我们说你有一个主题组件和一个主题组件(主题列表)。组件能够呈现其他组件,因此主题可以呈现许多主题组件。

考虑到这一点,让我们说我们的出发点是主题:

class Topics extends React.Component {
    // In a typical single page application you will receive topics from outside, for example from a REST API.
    const topics = [{
        name: "Topic1",
        id:   1
    }, {
        name: "Topic2",
        id:   2
    }];

    render() {
        return (
            <div>
                {
                    topics.map(topic => <Topic 
                        name={topic.name}
                        topicId={topic.id}
                    />)
                }
            </div>
        );
    }
}

主题看起来与Ori Drori的回答完全相同。

当您的应用程序增长(许多依赖项和属性冒泡)时,组合组件的好方法可能会变得非常困难,特别是因为您需要在多个组件层之间进行大量数据转换。这就是Redux或React Baobab的用武之地,它提供了一种方法来消除数据转换以及从组件到集中模块的状态转换 - 状态。