【问题标题】:Converting 'Const' ReactJs components to class based with param使用参数将“Const”ReactJs 组件转换为基于类
【发布时间】: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>
)

【问题讨论】:

    标签: javascript reactjs class components


    【解决方案1】:

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

    1. 将函数组件主体中的所有内容移动到类组件的render 方法中。如果主体是 JSX 本身,则只需从 render 方法中 return 即可。
    2. 通过解构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
      猜你喜欢
      • 1970-01-01
      • 2021-11-24
      • 1970-01-01
      • 1970-01-01
      • 2021-11-12
      • 2020-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多