所以我遇到了一个无法解决的问题,我正在使用:反应冗余存储器和nodejs后端
我有一个模态组件,它打开并允许用户更改用户化身,我有一个父组件,应该显示当前用户的头像
在模态打开并且用户选择他们想要的文件之后,该文件通过Axios发布请求发送到服务器,服务器总是重写以前的化身,因此如果我想访问化身,链接总是相同的。我转到这个URL:http://localhost:3001/users/${action_id}/化身
我最初认为我可以使用我的image src中的URL作为父元素,但当化身更改时,父组件不会重新发送,因此静态URL不是一个好的选择
因此,我决定在redux存储中存储一个名为avatar的新变量,并将静态URL存储在存储中,将store.user.avatar作为我图像的src。每次我发出Axios帖子请求时,我也将存储值设置为相同的静态STRING URL,但由于字符串的值没有改变,并且是相同的,因此不会导致重新发送
因此,我认为javascript对象从未被视为与{url:1}!={url:1}也许如果将URL存储在一个对象中,它会被评估为不相同,并导致重新发布,但它不起作用!!
这是我的redux商店我正在使用mapStateToProps,并将图像的值设置为状态下URL的值:
const mapStateToProps = (state) => {
return {
userAvatar: state.user.avatar.url,
};
};
export default connect(mapStateToProps)(Header);
以下是我在上传点击时发送的操作:
export const setUserAvatar = (avatar) => ({
type: "SET_USER_AVATAR",
avatar,
});
export const startSetUserAvatar = (file, userAvatarURLForStateChange) => (
dispatch
) => {
let formData = new FormData();
formData.append("avatar", file);
return axios({
url: "/users/me/avatar",
method: "POST",
data: formData,
})
.then((res) => {
dispatch(setUserAvatar(userAvatarURLForStateChange));
return res.status;
})
.catch((err) => {
console.log("avatar upload action error :", err);
return err;
});
};
这是我的还原剂:
case "SET_USER_AVATAR":
return {
...state,
avatar: { ...action.avatar },
};
所以10个小时后我来了,需要你的慷慨帮助
好吧,经过无数次的挣扎,我意识到自己做错了什么reactjs不会在一天结束时检查reRender的状态变化,它只关心virtualDOM,所以如果状态变化但值没有变化,这意味着virtualDOM完全相同,它不会重新渲染,
因此,在我的情况下,即使将状态化身设置为包含URL的对象,也不会更改img src属性,从而导致not RENDERING
为了解决这个问题,discord频道上的某个人建议在URL的末尾添加一个查询字符串,例如我添加了一个/?每次我想要一个reRender并想要调度操作时,字符串末尾的{somerandomnumber}就是我如何编辑我的reducer来解决这个问题的:
case "SET_CURRENT_USER":
return {
name: action.name,
lastname: action.lastname,
number: action.number,
email: action.email,
isAuth: true,
id: action._id,
avatar: `http://localhost:3001/users/${
action._id
}/avatar/?${moment().valueOf()}`,
};