使用参数将“Const”ReactJs 组件转换为基于类

Posted

技术标签:

【中文标题】使用参数将“Const”ReactJs 组件转换为基于类【英文标题】:Converting 'Const' ReactJs components to class based with param 【发布时间】:2018-05-28 11:19:23 【问题描述】:

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

什么有效:

这个

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>
    );
  

尚未完成:

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

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>
)

【问题讨论】:

【参考方案1】:

从函数组件转换为类组件:

    将函数组件主体中的所有内容移动到类组件的render 方法中。如果主体是 JSX 本身,则只需从 render 方法中 return 即可。 通过解构this.props,将所需的道具分配给常量。

注意:对于没有状态或需要生命周期方法的仅查看组件,您应该保留无状态组件。

之前的主题:

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>
    );
  

【讨论】:

【参考方案2】:

为了扩展 Ori Drori 的解决方案(这是完全正确的),我想为您提供更多关于组件组合的上下文,以了解道具来自何处(尚未回答)。

假设您有一个主题组件和一个主题组件(主题列表)。组件可以渲染其他组件,所以 Topics 可以渲染很多 Topic 组件。

考虑到这一点,假设我们的起点是主题:

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 的用武之地,它提供了一种方法来删除数据转换以及从组件到集中式模块(状态)的状态转换。

【讨论】:

感谢您的解释。 @tobias

以上是关于使用参数将“Const”ReactJs 组件转换为基于类的主要内容,如果未能解决你的问题,请参考以下文章

将功能组件转换为类组件(ReactJS)的问题

将 HTML 转换为 ReactJS 组件

ReactJS:将 html 文件转换为 React 组件

将具有参数的无状态React组件转换为有状态

如何将此基于 ReactJS 类的组件转换为基于函数的组件?

如何使用 ReactJS 将 div 转换为画布?