javascript - 为什么在第一次登录时(通过获取请求)获取先前用户的帖子?
问题描述
我有一个简单的博客,其中 eash 用户有帖子。登录时用户被重定向到主页,该主页从 APi 获取该用户的所有帖子。然而奇怪的事情发生了,在登录用户被重定向到主页但第一个获取请求获取前一个用户的帖子后。这仅在第一次提取时发生。如果我刷新,则获取当前用户的帖子。有人可以解释发生了什么并提供解决方案吗?
以下是 Home.jsx 的代码
import React, { useEffect } from "react";
import { useSelector } from "react-redux";
import Container from "@material-ui/core/Container";
import Link from "@material-ui/core/Link";
import { getPosts } from "../../actions/authActions";
export default function Home() {
useEffect(() => getPosts(), []);
const { posts, userId } = useSelector(getUser);
return (
<Container>
<h1>Home</h1>
<p>
Lacus vel facilisis volutpat est velit egestas dui id ornare. Semper
auctor neque vitae tempus quam. Sit amet cursus sit amet dictum sit amet
justo. Viverra tellus in hac habitasse. Imperdiet proin fermentum leo
vel orci porta. Donec ultrices tincidunt arcu non sodales neque sodales
ut. Mattis molestie a iaculis at erat pellentesque adipiscing. Magnis
dis parturient montes nascetur ridiculus mus mauris vitae ultricies.
Adipiscing elit ut aliquam purus sit amet luctus venenatis lectus.
Ultrices vitae auctor eu augue ut lectus arcu bibendum at. Odio euismod
lacinia at quis risus sed vulputate odio ut. Cursus mattis molestie a
iaculis at erat pellentesque adipiscing.
</p>
{posts.map((post, index) => {
return (
<div key={index}>
<h1>{post.title}</h1>
<p>
{post.content.substring(0, 100) + " ..."}
<Link href={`/users/${userId}/posts/${post._id}`} variant="body2">
Read more
</Link>
</p>
</div>
);
})}
</Container>
);
}
export const getUser = (state) => state.auth;
以下是 loginUser.js 函数:
export const loginUser = (userData, history) => {
axios
.post(`${url}login`, userData)
.then((res) => {
// Save to localStorage
// Set token to localStorage
const { token } = res.data;
localStorage.setItem("jwtToken", token);
// Set token to Auth header
setAuthToken(token);
// Decode token to get user data
const decoded = jwt_decode(token);
//Set user and is Authenticated
localStorage.setItem("id", decoded.id);
localStorage.setItem("isAuthenticated", true);
dispatch(setCurrentUser(decoded.id));
console.log(decoded.posts);
dispatch(setPosts(decoded.posts));
//redirect to home page
history.push(`/users/${decoded.id}/home`);
})
.catch((e) => {
//handle validation errors
if (e.response.status === 400)
return dispatch(saveErrors(e.response.data));
//handle other errors
dispatch(saveErrors(e.response.status));
});
};
setCurrentUser 函数
// Set logged in user
export const setCurrentUser = (user) => {
return {
type: SET_CURRENT_USER,
payload: user,
};
};
authReducer.js
import { SET_CURRENT_USER, SET_POSTS } from "../actions/types";
import isEmpty from "is-empty";
const initialState = {
userId: localStorage.id,
posts: [],
isAuthenticated: localStorage.isAuthenticated,
};
export default function (state = initialState, action) {
switch (action.type) {
case SET_CURRENT_USER:
return {
...state,
userId: action.payload,
isAuthenticated: !isEmpty(action.payload),
};
case SET_POSTS:
return {
...state,
posts: action.payload,
};
default:
return state;
}
}
以下是 getPosts.js 函数:
export const getPosts = () =>
axios
.get(`${url + userId}/home`)
.then((res) => dispatch(setPosts(res.data)))
.catch((e) => dispatch(saveErrors(e.response.status)));
解决方案
我通过传递 userid 作为参数来解决它来获取帖子功能。以前我通过操作页面中的 store.getstate() 获取用户 ID。现在它是从 home.jsx 页面传递的。这解决了我的问题。
export const getPosts = (userId) => // userid 是从首页 axios 传递过来的 .get( ${url + userId}/home
) .then((res) => dispatch(setPosts(res.data))) .catch((e) => dispatch(saveErrors (e.response.status)));
推荐阅读
- spring - 如何从 Spring Batch itemwritter 调用过程,我需要从过程中捕获输出参数数据以调用另一个过程
- javascript - 网站在 PC 上显示为部分文本和部分 html
- javascript - 发送消息程序
- react-admin - 尝试添加下一个按钮
的 滚动选项卡 - java - 如何在适配器内的视图中膨胀图像
- javascript - 有没有办法将静态和动态路由设置到同一个地方?
- r - summaryBy 和很多变量
- javascript - 聚合物构建单一元素“点燃元素”
- pyspark - 将 Python 脚本提交到 Databricks JOB
- c# - 如何将带有数据的 string[][] 转换为 IDataView-Object?(ML.NET)