即使在添加 extraReducers 后,Redux Toolkit 状态也不会更新
Redux Toolkit state doesn't update even after adding extraReducers
与以前的版本相比,我对 redux 工具包的了解非常有限。我很难理解为什么我的状态没有在 getUsers 触发时得到更新。
我也添加了 extraReducers
。
import { createAsyncThunk, createSlice } from '@reduxjs/toolkit';
import { fetchSample } from './filterAPI';
export const getUsers = createAsyncThunk(
'primaryFilters/getUsers',
async (dispatch, getState) => {
console.log(getState, dispatch);
const response = await fetchSample();
return response;
}
);
const primaryFiltersSlice = createSlice({
name: 'primaryFilters',
initialState: {
dateFilter: {
dates: {
key: 'selection',
startDate: new Date(),
endDate: new Date(),
},
dummyData: null,
},
status: null,
},
extraReducers: (builder) => {
builder
.addCase(getUsers.pending, (state) => {
state.status = 'loading';
})
.addCase(getUsers.fulfilled, (state, action) => {
state.status = 'idle';
state.dummyData = action.payload;
})
.addCase(getUsers.rejected, (state, action) => {
state.status = 'failed';
});
},
});
export default primaryFiltersSlice.reducer;
这里是 fetchSample 函数:
export const fetchSample = async () => {
const response = await fetch('https://jsonplaceholder.typicode.com/todos/1');
return response.json();
};
另外,我想指出的是,我的状态正在从 pending 触发到 idle 等等,但我的实际状态并没有更新。
这是相同的屏幕截图:
我还想知道我们如何在这些 extraReducers 中记录消息。
出于某种原因,我可以通过将状态更新保持在底部而不是顶部来调度操作。我很想对此有更好的解释,这就是我的代码的确切修复:
import { createAsyncThunk, createSlice } from '@reduxjs/toolkit';
import { fetchSample } from './filterAPI';
export const getUsers = createAsyncThunk(
'primaryFilters/getUsers',
async (dispatch, getState) => {
console.log(getState, dispatch);
const response = await fetchSample();
return response;
}
);
// export const updateDates = () => {
// }
const primaryFiltersSlice = createSlice({
name: 'primaryFilters',
initialState: {
dateFilter: {
dates: {
key: 'selection',
startDate: new Date(),
endDate: new Date(),
},
dummyData: null,
},
status: null,
},
reducer: {
updateDate: (state, action) => {
console.log('Actions = ', action);
},
},
extraReducers: (builder) => {
builder
.addCase(getUsers.pending, (state) => {
state.status = 'loading';
})
.addCase(getUsers.fulfilled, (state, action) => {
state.dummyData = action.payload;
state.status = 'idle';
})
.addCase(getUsers.rejected, (state, action) => {
state.status = 'failed';
});
},
});
export default primaryFiltersSlice.reducer;
首先,查看您的数据结构,您可能想要更新 state.dateFilter.dummyData
,而不是 state.dummyData
- 至少假设您想要匹配您的 initialState
结构。
此外,createAsyncThunk
不接受回调 dispatch, getState
:
正确的是
export const getUsers = createAsyncThunk(
'primaryFilters/getUsers',
async (arg, {dispatch, getState}) => {
(但这并没有什么区别,因为你两者都没有使用)
至于日志...只是 console.log
?或者你的意思是你得到了一个 Proxz 对象?那样的话 console.log(current(state))
与以前的版本相比,我对 redux 工具包的了解非常有限。我很难理解为什么我的状态没有在 getUsers 触发时得到更新。
我也添加了 extraReducers
。
import { createAsyncThunk, createSlice } from '@reduxjs/toolkit';
import { fetchSample } from './filterAPI';
export const getUsers = createAsyncThunk(
'primaryFilters/getUsers',
async (dispatch, getState) => {
console.log(getState, dispatch);
const response = await fetchSample();
return response;
}
);
const primaryFiltersSlice = createSlice({
name: 'primaryFilters',
initialState: {
dateFilter: {
dates: {
key: 'selection',
startDate: new Date(),
endDate: new Date(),
},
dummyData: null,
},
status: null,
},
extraReducers: (builder) => {
builder
.addCase(getUsers.pending, (state) => {
state.status = 'loading';
})
.addCase(getUsers.fulfilled, (state, action) => {
state.status = 'idle';
state.dummyData = action.payload;
})
.addCase(getUsers.rejected, (state, action) => {
state.status = 'failed';
});
},
});
export default primaryFiltersSlice.reducer;
这里是 fetchSample 函数:
export const fetchSample = async () => {
const response = await fetch('https://jsonplaceholder.typicode.com/todos/1');
return response.json();
};
另外,我想指出的是,我的状态正在从 pending 触发到 idle 等等,但我的实际状态并没有更新。
这是相同的屏幕截图:
我还想知道我们如何在这些 extraReducers 中记录消息。
出于某种原因,我可以通过将状态更新保持在底部而不是顶部来调度操作。我很想对此有更好的解释,这就是我的代码的确切修复:
import { createAsyncThunk, createSlice } from '@reduxjs/toolkit';
import { fetchSample } from './filterAPI';
export const getUsers = createAsyncThunk(
'primaryFilters/getUsers',
async (dispatch, getState) => {
console.log(getState, dispatch);
const response = await fetchSample();
return response;
}
);
// export const updateDates = () => {
// }
const primaryFiltersSlice = createSlice({
name: 'primaryFilters',
initialState: {
dateFilter: {
dates: {
key: 'selection',
startDate: new Date(),
endDate: new Date(),
},
dummyData: null,
},
status: null,
},
reducer: {
updateDate: (state, action) => {
console.log('Actions = ', action);
},
},
extraReducers: (builder) => {
builder
.addCase(getUsers.pending, (state) => {
state.status = 'loading';
})
.addCase(getUsers.fulfilled, (state, action) => {
state.dummyData = action.payload;
state.status = 'idle';
})
.addCase(getUsers.rejected, (state, action) => {
state.status = 'failed';
});
},
});
export default primaryFiltersSlice.reducer;
首先,查看您的数据结构,您可能想要更新 state.dateFilter.dummyData
,而不是 state.dummyData
- 至少假设您想要匹配您的 initialState
结构。
此外,createAsyncThunk
不接受回调 dispatch, getState
:
正确的是
export const getUsers = createAsyncThunk(
'primaryFilters/getUsers',
async (arg, {dispatch, getState}) => {
(但这并没有什么区别,因为你两者都没有使用)
至于日志...只是 console.log
?或者你的意思是你得到了一个 Proxz 对象?那样的话 console.log(current(state))