react-redux - ReduxToolkit-CreateAsyncThunk - 异步操作正在工作,但当状态改变时反应应用程序没有更新
问题描述
嗨,我已经用 react 实现了 Redux 工具包,并在那里应用了 createAsyncthunk 功能,因此操作正常工作,但 react 应用程序没有刷新以反映状态的变化。如果问题存在但问题不存在,我还检查了组件。
在下图中,您可以看到,deleteIssue 操作已成功执行,但应用程序尚未更新组件。您可以在 redux 开发工具中看到 redux 操作,还可以看到应用尚未刷新。
您可以查看下面的屏幕截图以供参考。 redux-state 更改但不更新应用程序以进行状态更改
我还认为问题可能出在状态可变性上,但 immer 会解决这个问题。
我无法解决异步操作正常工作背后的问题 n 状态也在发生变化,但应用程序未针对更新的 redux 状态进行更新。
import { createAsyncThunk, createSlice } from '@reduxjs/toolkit';
import axios from 'axios';
// import thunk from 'redux-thunk';
const url = axios.create({baseURL:'http://localhost:3001'});
const initialState = {
issues:[],
status:null
};
export const getIssues = createAsyncThunk(
'issue/getIssues',
async () => {
return url.get('/issues').then(res => {
return res.data;
});
}
);
export const addIssue = createAsyncThunk(
'issue/addIssue',
async (issue) => {
return url.post(`/issues/`,issue).then(res => {
return res.data;
});
}
);
export const updateIssue = createAsyncThunk(
'issue/updateIssue',
async ({issue}) => {
console.log(issue);
return url.patch(`/issues/${issue.id}`,issue).then(res => {
console.log(issue+'reached in');
return res.data;
});
}
);
export const deleteIssue = createAsyncThunk(
'issue/deleteIssue',
async (id) => {
console.log('in reducer'+id);
return url.delete(`/issues/${id}`).then(res => {
console.log(id+'reached in');
return res.data;
}).catch(err => console.log(err));
}
);
const issueSlice = createSlice({
name:'issue',
initialState,
extraReducers:(builder) =>{
builder.addCase(getIssues.pending,(state) => {
state.status='loading';
}).addCase(getIssues.fulfilled,(state,action)=>{
state.issues = action.payload;
state.status = 'success';
}).addCase(getIssues.rejected,(state)=>{
state.status = 'failed';
})
builder.addCase(addIssue.pending,(state)=>{
state.status='loading'
}).addCase(addIssue.fulfilled,(state,action)=>{
action.payload.id=state.issues.length+1;
state.issues.push(action.payload)
state.status = 'success';
}).addCase(addIssue.rejected,(state)=>{
state.status='failed'
})
builder.addCase(updateIssue.pending,(state)=>{
state.status='loading'
}).addCase(updateIssue.fulfilled,(state,action)=>{
state.issues = state.issues.map(issue => issue.id === action.payload.id ? action.payload : issue )
state.status = 'success';
}).addCase(updateIssue.rejected,(state)=>{
state.status='failed'
})
builder.addCase(deleteIssue.pending,(state)=>{
state.status='loading'
}).addCase(deleteIssue.fulfilled,(state,action)=>{
const newState = state.issues.filter(issue => issue.id !== action.payload);
state.issues = newState;
state.status = 'success';
}).addCase(deleteIssue.rejected,(state)=>{
state.status='failed'
})
}
});
export default issueSlice.reducer;
List.js - 未实现状态更改的组件
import React,{useEffect} from 'react';
import ListItem from './ListItem';
import { getIssues,deleteIssue } from '../Redux/Reducer/issueReducer';
import { useDispatch,useSelector } from 'react-redux';
const List = () => {
const dispatch = useDispatch();
useEffect(() => {
dispatch(getIssues());
},[dispatch]);
const delHandler = (id) => {
dispatch(deleteIssue(id));
}
const realIssues = useSelector(state => state.issue);
console.log(realIssues);
const ListContents = realIssues.issues.map(issue => (
<ListItem key={issue.id} {...issue} onDelete={delHandler}/>
));
return(
<>
<h1>List</h1>
{ListContents}
</>
)
}
export default List;
该应用程序是一种 CRUD 问题跟踪器应用程序。为后端实现 JSON-server。
我无法解决异步操作正常工作背后的问题 n 状态也在发生变化,但应用程序未针对更新的 redux 状态进行更新。
解决方案
推荐阅读
- python - matplotlib:在子图中设置 sharex 后刻度标签消失
- asp.net-mvc - ASP.NET MVC 以小写形式呈现 html 标签和属性
- c# - WPF 在 ComboBox 中绘制图元
- nginx - 条件,如果重写返回404状态,返回另一个页面
- jboss - 如果侦听器关闭,持久 JMS 消息如何存活
- vim - 使用 vim-surround 在不同的行上包装变量值
- asp.net-mvc - OnActionExecuted 被意外调用
- angular - angular fontawesome 库复合名称并使用常规图标
- css - 移动响应有溢出-y
- powershell - 无法找到或加载主类 com.smartbear.ready.cmd.runner.pro.SoapUIProTestCaseRunner