使用参数将“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 组件转换为基于类的主要内容,如果未能解决你的问题,请参考以下文章