【发布时间】:2021-06-27 17:57:48
【问题描述】:
例如,我有一个初始状态,例如从 db 的 fetch post 请求中设置初始状态:
const initialState = {
posts: [],
};
export default function (state = initialState, action) {
const { type, payload } = action;
switch (type) {
case SET_APP_INITIAL_STATE:
return {
posts: payload.posts,
};
...
注意:这里的帖子还包含需要在前端显示的数组缓冲区(有点重),即视频、图像等
然后在一个组件中,我使用 react redux 和 thunk reducers 获取这些并尝试显示它们,我执行以下操作:
const { posts: defaultPosts } = useSelector(state => state.myApp);
{defaultPosts && defaultPosts.length > 0 ? defaultPosts.map((singlePost, index) =>(
<div key={index} className="post">
<div className="postTop">
<Avatar
src={singlePost.profilePic}
className="postTopAvatar"
/>
<div className="postTopInfo">
<h3>{singlePost.name}</h3>
</div>
</div>
{singlePost.type === 'VIDEO' && singlePost.attachedMedia ?
<div className="postImage">
<Video media={singlePost.attachedMedia} />
</div>
: null}
{singlePost.type === 'PHOTO' && singlePost.attachedMedia ?
<div className="postImage">
<Image media={singlePost.attachedMedia} />
</div>
: null}
.....
这里 Video/Image 组件利用 ref 并使用下面的 url 设置 src 以显示视频/图像等:
注意:singlePost.attachedMedia 包含数组缓冲区和 mime 类型信息
const image = new Blob([arraybuffer], {
type: mimeType
});
const url = URL.createObjectURL(image);
问题:
- 我不尝试深度克隆整个状态,只通过执行以下操作对其进行修改:
case SET_APP_POST_LIKE:
state.posts[payload.index].like = true;
return {
...state
};
这是错的吗?阅读其他博客文章似乎是一种非常糟糕的做法,但我不确定是否每次都进行深度克隆?
-
即使我按下一个赞按钮,我的整个帖子页面也会再次呈现?有没有办法不渲染任何东西,只渲染类似按钮。我已经通过播放视频进行了测试,当我按下它时它从开始开始并且还需要一秒钟才能加载。 (我认为它会重新渲染)
-
我还应该将我在帖子中包含所有内容的状态更改为如下所示。如果是,那么如果我尝试更改帖子数组会发生什么?整个状态会再次重新渲染吗?
const initialState = {
posts: [],
media: [],
comments: []
};
请提供任何帮助,我们将不胜感激,在这里停留了一段时间。如果您需要任何澄清,请告诉我。谢谢!
编辑 1:
现在我只有 posts 数组,其中包含所有媒体(图像、视频的数组缓冲区)、cmets 和其他内容。你的意思是我应该把它们分成{帖子、媒体、cmets ...}吗?我试着做你提到的,即
const initialState = {
posts: [],
media: []
};
我现在将媒体称为 const { media } = useSelector(state => state.posts); 我将我的状态更新为
case SET_FB_POST_LIKE:
state.posts[payload.index].like = true;
return {
...state
};
但还是没有运气!
【问题讨论】:
-
这样看:defaultPosts?.length > 0 &&something..比较干净
-
谢谢,好收获!
标签: reactjs redux react-redux