【发布时间】:2020-06-26 20:15:48
【问题描述】:
我正在使用 React 构建一个网站,该网站将变得非常庞大(就功能而言)。 目前,我是唯一一个在前端堆栈工作的人,但稍后会有人加入。
现在,我对 React 还比较陌生,我想到了一种方法,可以在不破坏所有内容的情况下更轻松地更改组件 UI:
假设我的主页上有一个类似于 Instagram 帖子的组件。我的想法是,在包含帖子的顶级组件上,我根本没有样式,但我将管理子组件必须访问的所有功能。请看下面的sn-p
const PostCard = ({ post }) => {
const [visibleComments, setComment] = useState(false);
const [comments, pushComments] = useState([]);
const [loadingMedia, setLoadingMedia] = useState(true);
const [medias, setMedias] = useState([]);
const [postState, setPostState] = useState(post);
const [commentToSend, setCommentToSend] = useState('');
const { age_of_post_in_seconds, created_by, has_media, uuid, text, likes_total, comments_total, liked_by_me, bookmarked_by_me } = postState;
useEffect(() => {
if (has_media) {
setLoadingMedia(true);
fetchMedia();
}
}, [])
async function fetchMedia() {
const medias = await getPostMedia(uuid);
if (!medias) console.log('there was an error');
else setMedias(medias);
setLoadingMedia(false);
}
async function handleLikePost(isLiked) {
const success = await likePost(uuid, isLiked);
if (success) setPostState({ ...postState, liked_by_me: isLiked, likes_total: isLiked ? postState.likes_total + 1 : postState.likes_total - 1 });
}
async function handleBookmarkPost(isBookmarked) {
const success = await bookmarkPost(uuid, isBookmarked);
if (success) setPostState({ ...postState, bookmarked_by_me: isBookmarked });
}
function handleCommentChange(text) {
setCommentToSend(text)
}
async function handleCommentPost() {
await commentPost(uuid, commentToSend);
pushComments([...comments, { text: commentToSend }]);
setCommentToSend('');
setPostState({ ...postState, comments_total: postState.comments_total + 1 });
}
async function handleShowComments() {
if (comments_total > 0) {
if (!visibleComments) {
const comments = await fetchPostComments(uuid);
pushComments(comments);
}
setComment(!visibleComments);
}
}
return (
<Body>
<Card>
<Header
caption={text}
name={created_by.handle}
time={age_of_post_in_seconds}
uniqueName={created_by.display_name}
avatar={created_by.profile_photo}
/>
{has_media && !loadingMedia && <Media medias={medias} />}
<Footer
likesTotal={likes_total}
likedByMe={liked_by_me}
bookmarkedByMe={bookmarked_by_me}
id={uuid}
likePost={handleLikePost}
bookmarkPost={handleBookmarkPost}
showComments={handleShowComments}
commentsTotal={comments_total}
/>
{visibleComments && <Comment comments={comments} />}
{<AddComment postId={uuid} sendComment={handleCommentPost} handleCommentChange={handleCommentChange} comment={commentToSend} />}
</Card>
</Body>
)
}
我认为这种方法的主要优点是可以对页脚进行操作并完全更改它,而不必关心破坏函数或回调。
你们如何看待这种方法?主要缺点是什么?
谢谢
【问题讨论】:
-
我认为你必须遵循这个结构,所有的逻辑部分甚至函数都放在容器部分,所有的显示都放在组件中。只是你必须从组件调用函数,所有逻辑部分都在容器中完成。
标签: javascript reactjs architecture