本节代码对应 GitHub 分支: chapter6
# 封装 UI 代码
现在 Album 里面的 JSX 过于庞大,影响可读性,可以做一下封装。
将复杂渲染的代码拆解如下:
const renderTopDesc = () => {
return (
<TopDesc background={currentAlbum.coverImgUrl}>
<div className="background">
<div className="filter"></div>
</div>
<div className="img_wrapper">
<div className="decorate"></div>
<img src={currentAlbum.coverImgUrl} alt="" />
<div className="play_count">
<i className="iconfont play"></i>
<span className="count">{getCount (currentAlbum.subscribedCount)}</span>
</div>
</div>
<div className="desc_wrapper">
<div className="title">{currentAlbum.name}</div>
<div className="person">
<div className="avatar">
<img src={currentAlbum.creator.avatarUrl} alt="" />
</div>
<div className="name">{currentAlbum.creator.nickname}</div>
</div>
</div>
</TopDesc>
)
}
const renderMenu = () => {
return (
<Menu>
<div>
<i className="iconfont"></i>
评论
</div>
<div>
<i className="iconfont"></i>
点赞
</div>
<div>
<i className="iconfont"></i>
收藏
</div>
<div>
<i className="iconfont"></i>
更多
</div>
</Menu>
)
};
const renderSongList = () => {
return (
<SongList>
<div className="first_line">
<div className="play_all">
<i className="iconfont"></i>
<span > 播放全部 <span className="sum">(共 {currentAlbum.tracks.length} 首)</span></span>
</div>
<div className="add_list">
<i className="iconfont"></i>
<span > 收藏 ({getCount (currentAlbum.subscribedCount)})</span>
</div>
</div>
<SongItem>
{
currentAlbum.tracks.map ((item, index) => {
return (
<li key={index}>
<span className="index">{index + 1}</span>
<div className="info">
<span>{item.name}</span>
<span>
{getName (item.ar)} - {item.al.name}
</span>
</div>
</li>
)
})
}
</SongItem>
</SongList>
)
}
return (
<CSSTransition
in={showStatus}
timeout={300}
classNames="fly"
appear={true}
unmountOnExit
onExited={props.history.goBack}
>
<Container>
<Header ref={headerEl} title={title} handleClick={handleBack} isMarquee={isMarquee}></Header>
{!isEmptyObject (currentAlbum) ?
(
<Scroll
bounceTop={false}
onScroll={handleScroll}
>
<div>
{ renderTopDesc () }
{ renderMenu () }
{ renderSongList () }
</div>
</Scroll>
)
: null
}
{ enterLoading ? <Loading></Loading> : null}
</Container>
</CSSTransition>
)
