javascript - 渲染组件时不触发 useEffect
问题描述
我正在单击主页上的单个帖子,该帖子会将我发送到点击帖子的页面。在此组件的渲染中,我正在从 useEffect 调度一个操作,该操作将从后端获取发布数据。但是 useEffect 甚至不会被触发一次,而是页面渲染两次。请帮忙
import {
Container,
Typography,
LinearProgress,
CircularProgress,
Paper
} from '@material-ui/core';
import React, {
useEffect
} from 'react';
import {
getPost
} from "../../actions/posts";
import Navbar from '../Navbar/Navbar';
import {
useDispatch,
useSelector
} from 'react-redux';
import {
useParams
} from 'react-router-dom';
import useStyles from "./styles";
const PostDetails = () => {
const dispatch = useDispatch();
const {
id
} = useParams();
const classes = useStyles();
const {
post,
isLoading
} = useSelector((state) => (state.posts));
console.log(post);
useEffect(() => {
console.log(post);
dispatch(getPost(id));
}, [id, dispatch]);
return ( < div >
<
Navbar color = "#808080" / > {
isLoading ? ( < div > < LinearProgress / > < /div>) :
( < Container className = {
classes.root
} >
<
Typography variant = "h1" > {
post.title
} < /Typography> <
/Container>)}</div > )
}
export default PostDetails
我的行动:
export const getPost = (id) => async(dispatch) => {
try {
dispatch({
type: "START_LOADING"
});
const {
data
} = await api.fetchPost(id);
dispatch({
type: "FETCH_POST",
payload: {
post: data
}
});
dispatch({
type: "END_LOADING"
});
} catch (error) {
console.log(error);
}
};
减速器:
export default (state = {
isLoading: true,
posts: []
}, action) => {
switch (action.type) {
case "START_LOADING":
return { ...state,
isLoading: true
};
case "FETCH_POST":
return { ...state,
post: action.payload.post
};
case "FETCH_ALL":
return { ...state,
posts: action.payload.data,
currentPage: action.payload.currentPage,
numberOfPages: action.payload.numberOfPages
};
case "CREATE":
return { ...state,
posts: [...state.posts, action.payload]
};
case "END_LOADING":
return { ...state,
isLoading: false
};
default:
return "";
}
}
我的后端很好,因为当我在 localhost 上运行 api 请求到后端时,它会向我发送一个带有 post 数据的 JSON 对象。
解决方案
UseEffect 仅在方括号内给出的值发生更改时触发。因此,如果您希望它仅在第一次加载页面时触发,请将其留空。
useEffect(() => {
console.log(post);
await dispatch(findPost(id));
}, []);
推荐阅读
- r - 使用 ggplot2 对数据进行子集化并在折线图上绘制两个变量
- wordpress - GatsbyJS 完全跳过了部署步骤
- verilog - 当我增加时钟分频时,4 位纹波进位计数器不起作用
- xamarin - 如何在代码中传递对象并在 XAML 页面中绑定到它?
- python - 将 Pandas 列中的整数浮点值转换为 int,同时保持非整数浮点数不变?
- xslt - 下面是如何在 XSLT 代码中添加页眉和页脚的示例
- android - 为什么改造要我使用查询
- java - 将远程 PC 连接到 RabbitMQ 时出现问题,无法连接
- javascript - 使用 PHP puphpeteer 保持 facebook 登录会话
- python - 将 -profile 参数添加到 python selenium 选项时,Firefox 连接被拒绝