当前位置: 首页 > 知识库问答 >
问题:

发送调度时UseEffect不更新react网站数据

董花蜂
2023-03-14

我正在创建一个图书推荐网站来练习MERN stack,但是我刚刚实现了喜欢博客,但要在你喜欢它之后查看喜欢的数量,需要刷新网站。如何修复此问题?

这是博客组件,在底部我有两个按钮来调度喜欢帖子并删除它。一旦按下删除,它就会将其从页面中删除,但类似的不起作用。

import React from 'react';
import { useDispatch } from 'react-redux';
import { Card, CardContent, CardActionArea, CardMedia, Paper, Typography, Grid, Button} from '@material-ui/core';
import { makeStyles } from '@material-ui/core/styles';
import DeleteIcon from '@material-ui/icons/Delete';
import FavoriteIcon from '@material-ui/icons/Favorite';
import { deleteBlog, likeBlog } from '../../../actions/blogs';

//Styles
const useStyles = makeStyles((theme)=>({
  root: {
    '& .MuiTextField-root': {
      margin: theme.spacing(1),
    },
  },
    media: {
      height: 190,
      width:160,
    },
    card: {
      margin: '5px',
      width: '70%'
    },
    cardContent: {
      margin: '0x',
    },
    actionArea:{
      width: 100,
    }
  }));

const Blog = ({blog, currentId}) => {
    const classes = useStyles();
    const dispatch = useDispatch(); 
    return ( 
            <Card className={classes.card}>
            <CardContent>
                      <Typography variant="h5">{blog.title}</Typography>
                    </CardContent>
             <Grid container>
              <Grid item className={classes.cardContent}>
                <CardMedia image={blog.selectedFile} title={blog.title} className={classes.media}/>
              </Grid>
              <Grid item className={classes.cardContent}>
                <CardContent>
                  <Typography variant="p">{blog.content}</Typography>
                  <br/>
                  <Typography variant="p">RATING: {blog.rating}/10</Typography>
                </CardContent>
              </Grid>
             </Grid>
             <CardContent align="right">
              <Button onClick={() => dispatch(deleteBlog(blog._id))}><DeleteIcon color="secondary"/></Button>
              <Button onClick={()=> dispatch(likeBlog(blog._id))}><FavoriteIcon color="primary"/>{blog.likes}</Button>
             </CardContent>
            </Card>
     );
}
 
export default Blog;

这是应用程序。js,其中useEffect为:

//Imports
import React, {useState, useEffect} from 'react';
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';
//Importing all components
import Home from './components/Home/Home';
import pageNotFound from './components/404/404';
import Blogs from './components/Blogs/Blogs';
import Form from './components/Form/Form';
import Navbar from './components/Navbar/Navbar';
import { useDispatch } from 'react-redux';
import {getBlogs} from './actions/blogs';

function App() {
  const [currentId, setCurrentId] = useState(0);
  const dispatch = useDispatch();

  useEffect(() => {
    dispatch(getBlogs());
  }, [dispatch]);
  return (
    <Router>
      <div className="App">
          <div className="Content">
          <Navbar/>
            <Switch>
              <Route exact path="/">
                <Home setCurrentId={setCurrentId} currentId={currentId}/>
              </Route>
              <Route exact path="/create">
                <Form setCurrentId={setCurrentId} currentId={currentId}/>
              </Route>
              <Route component={pageNotFound} />
            </Switch>
          </div>
      </div>
    </Router>
  );
}

export default App;

任何帮助都将不胜感激。

编辑:

以下是类似的博客行动:

export const likeBlog = (id) => async (dispatch) => {
    try {
        const { data } = await api.likeBlog(id);
        dispatch({ type: LIKE, payload: id });
    } catch (error) {
        console.log(error);
    }
}

以下是减速器:

import { FETCH_ALL, FETCH, CREATE, DELETE, LIKE} from '../constants/actionType';

//Checking for action type and responding
export default (blogs =[], action) => {
    switch (action.type) {
        case FETCH_ALL:
            return action.payload;
        case FETCH:
            return action.payload;
        case CREATE:
            return [...blogs, action.payload];
        case DELETE:
            return blogs.filter((blog) => blog._id !== action.payload);
        case LIKE:
            return blogs.map((blog) => (blog._id === action.payload._id ? action.payload : blog));
        default:
            return blogs;
    }
}

共有1个答案

夹谷浩宕
2023-03-14

由于您只将id作为负载分派到类似于日志的操作中,操作。有效载荷_reducer中的id未定义,导致传递到映射的回调返回blogs数组中每个项目的旧blog对象(您正在将id与未定义的blog进行比较)。

您应该将更新的博客对象作为有效负载进行调度。

dispatch({ type: LIKE, payload: id })

应该是

dispatch({ type: LIKE, payload: data })

 类似资料:
  • 我不熟悉React钩子和React 16.13.1。 我将实现能够处理登录的Auth组件。 但是它似乎没有正确更新状态,即使使用响应对象调用。 这个代码有什么问题?

  • 问题内容: 我的Web应用程序的后端接收来自多个客户端的更新。发生此类更新时,应将其传达给所有其他客户端。 后端更新后,如何启动从服务器到所有Web浏览器客户端的更新? 我正在使用JBoss,JSF和Spring框架。 问题答案: 参见类似的堆栈溢出问题:WebSockets与服务器发送的事件/EventSource 我假设像DarthVader一样,您的前端是某种(通常)无状态的HTML页面。浏

  • 使用React 16.8,我已经用useReucer、useContext钩子实现了我的项目,并创建了一个类似于Redux的全局状态管理系统。 在视图中,当我试图在useEffect中获取数据时,它会导致最大更新深度错误。 我已经尝试了Facebook React-Hooks常见问题解答中的所有示例,但无法解决问题。 我的package.json是这样的: 下面是我的代码示例: 这里是风景。js

  • 本文向大家介绍PHP中调用SVN命令更新网站方法,包括了PHP中调用SVN命令更新网站方法的使用技巧和注意事项,需要的朋友参考一下 想说写一个通过网页就可以执行 SVN 升级的程序,结果并不是我想得那样简单,有一些眉角需要注意的说。 先以 Apache 的用户帐号执行 SVN checkout,这样 Apache 才有 SVN 的链结权力,才可以通过网页执行 SVN update 在用 PHP 执

  • 问题内容: 在我的React应用程序中,我有一个参数数组(例如一些ID),这些参数应该用作ajax调用队列的参数。问题是该数组可能包含1000多个项目,如果我仅使用forEach循环递归地进行ajax调用,则浏览器页面最终会在每个请求得到解决之前停止响应。 是否有一种技术/库可以允许以异步方式一次发送5个请求,例如,一次异步发送ajax请求,并且仅在这些请求完成后才继续下一个5? 后续问题: 反应

  • 问题内容: TLDR:使用defaultChecked而不是已检查的工作jsbin。 尝试设置一个简单的复选框,该复选框将在选中时划掉其标签文本。由于某些原因,当我使用组件时,不会触发handleChange。谁能解释我在做什么错? 用法: 解: 使用checked不会使基础值(显然)发生变化,因此不会调用onChange处理程序。切换到defaultChecked似乎可以解决此问题: 问题答案: