javascript - 如何为渲染和逻辑重构反应组件?
问题描述
我有反应组件:
function FavoritesListItem({ merchant, config, isFavorited }) {
const {
name, id, logoUrls = {}, offersCount, rebate, showRebate,
} = merchant;
const { rebateOptions } = config;
return (
const renderActiveMerchant = () => (
<div
className="mn_favoriteMerchant"
data-merchant-id={id}
data-merchant-name={name}
role="listitem"
data-test="favorite-merchant"
>
<div className="mn_favoriteMerchantInner">
<MerchantExperienceLink
className="mn_favoriteMerchantLink"
merchant={merchant}
title={`Opens merchant detail page at ${name}`}
>
<FavoriteIcon
merchantId={id}
merchantName={name}
labelUnfavorite={`Remove ${name} from Favorites list`}
showSpinner={!isFavorited}
/>
<div className="mn_logo"><img data-test="favorited-merchant-logo" src={logoUrls._120x60} alt={name} /></div>
<p className="mn_offersCount" data-test="favorited-merchant-offers-count">{offersCount} offers available </p>
</MerchantExperienceLink>
{rebate && (
<MerchantClickUrlLink className="mn_favoriteMerchantRebateLink" merchant={merchant}>
<div className="mn_rebate">
{showRebate
? <MerchantRebate {...rebate} {...rebateOptions} />
: <MerchantNoRebateLabel />}
? <MerchantRebate {...rebate} {...rebateOptions} />
: <MerchantNoRebateLabel />}
</div>
</MerchantClickUrlLink>
)}
</div>
</div>
);
const renderDeactivatedMerchant = () => (
<div
className="mn_favoriteMerchant"
data-merchant-id={id}
data-merchant-name={name}
role="listitem"
data-test="favorite-merchant"
>
<div className="mn_favoriteMerchantInner">
<MerchantExperienceLink
className="mn_favoriteMerchantLink"
merchant={merchant}
title={`Opens merchant detail page at ${name}`}
>
<FavoriteIcon
merchantId={id}
merchantName={name}
labelUnfavorite={`Remove ${name} from Favorites list`}
showSpinner={!isFavorited}
/>
<div className="mn_logo mn_noRebateMerchantLogo">
<img data-test="favorited-merchant-logo" src={logoUrls._120x60} alt={name} />
</div>
{rebate && (
<div className="mn_rebate mn_deactivatedRebate">
{
showRebate
? <MerchantNoRebateLabel />
: <MerchantRebate {...rebate} />
}
</div>
)}
</MerchantExperienceLink>
</div>
</div>
);
return (
merchant.type === 'Deactivated Merchant' ? renderDeactivatedMerchant() : renderActiveMerchant()
);
}
const mapStateToProps = () => {
const selectFavoriteByMerchantId = makeSelectFavoriteByMerchantId();
return (state, { merchant }) => ({
isFavorited: selectFavoriteByMerchantId(state, merchant.id),
});
};
export default connect(mapStateToProps)(FavoritesListItem);
并且需要将其重构为 2 个单独的组件,它们将仅渲染 renderDeactivatedMerchant 和 renderActiveMerchant。所有其他逻辑都应该在这个组件中 FavoritesListItem
所以我以这种方式创建了组件:
export class FavoritesListItemDeactivatedMerchant extends Component ({ merchant, config, isFavorited }) {
render() {
const { merchant, config, isFavorited } = this.props;
const {
name, id, logoUrls = {}, rebate, showRebate,
} = merchant;
const { rebateOptions } = config;
return (
<div
className="mn_favoriteMerchant"
data-merchant-id={id}
data-merchant-name={name}
role="listitem"
data-test="favorite-merchant"
>
<div className="mn_favoriteMerchantInner">
<MerchantExperienceLink
className="mn_favoriteMerchantLink"
merchant={merchant}
title={`Opens merchant detail page at ${name}`}
>
<FavoriteIcon
merchantId={id}
merchantName={name}
labelUnfavorite={`Remove ${name} from Favorites list`}
showSpinner={!isFavorited}
/>
<div className="mn_logo mn_noRebateMerchantLogo">
<img data-test="favorited-merchant-logo" src={logoUrls._120x60} alt={name} />
</div>
{rebate && (
<div className="mn_rebate mn_deactivatedRebate">
{
showRebate
? <MerchantNoRebateLabel />
: <MerchantRebate {...rebate} />
}
</div>
)}
</MerchantExperienceLink>
</div>
</div>
);
}
}
const mapStateToProps = () => {
const selectFavoriteByMerchantId = makeSelectFavoriteByMerchantId();
return (state, { merchant }) => ({
isFavorited: selectFavoriteByMerchantId(state, merchant.id),
});
};
export default connect(mapStateToProps)(FavoritesListItemDeactivatedMerchant);
项目构建没有错误,控制台也没有错误。但它不会在浏览器中呈现这个组件。我做错了什么?请帮忙。
解决方案
您混淆了函数和类组件的语法,并创建了一个将两者结合在一起的奇怪混搭:
export class FavoritesListItemDeactivatedMerchant extends Component ({ merchant, config, isFavorited }) {
那些道具在课堂上毫无意义!我想你的意思是写这个:
export const FavoritesListItemDeactivatedMerchant = ({ merchant, config, isFavorited }) => {
或者
export function FavoritesListItemDeactivatedMerchant({ merchant, config, isFavorited }) {
就个人而言,我认为您可以通过RenderMerchant
与道具共享isDeactivated
而不是使用单独的组件来激活和停用来改进此代码。您要避免的两种情况之间有很多重复的代码。
推荐阅读
- reactjs - 如何使用 React Rsuite 库创建自定义 Less 主题
- java - 如何在没有未配对代理字符的情况下将表情符号等字符编码为 UTF8?
- docker - Docker 容器端口 6002 连接被拒绝
- python - 如何修复 Python 列表中 for 循环中的缺失值?
- python - 如何使用 Visual Studio Code 修复 Python 中的 ModuleNotFoundError
- javascript - 如何使用 api-3 和 OAuth-2.0 修复更新博主的 401 未授权错误
- google-cloud-platform - 如何在 Google Cloud Run 中将所有 http 流量重定向到 https
- macos - 从 Dock 运行时打包的 Electron 应用程序不会启动,但从终端运行时运行良好
- python - 我想知道是否有一种方法可以使用 sorted() 函数按 2-d 甚至 3-d 数组中的指定索引进行排序
- batch-file - 如何每半秒重复操作一次窗口命令?