使用 REDUX 将初始状态设置为来自 API 的响应
Setting Initial State to response from API with REDUX
我在设置 api 对初始状态对象的响应时遇到问题。
我已经尝试使用文档中所述的 useAsyncThunk,但是我正在处理的项目只允许我使用 redux-thunk。
目标是从 https://jsonplaceholder.typicode.com/users 下载用户名并使用它来创建一个自动填充输入字段来建议用户名。
我不明白你为什么要将你的用户名初始化为 initialState。这不是 redux 模式的工作原理。通常,您使用合理的空状态初始化您的商店:
const initialState = {
loading: false,
usernames: [],
}
const reducer = (state = initialState, action) => {
switch (action.type) {
case LOADING_USERNAMES:
return {
...state,
loading: true,
};
case USERNAMES_LOADED:
return {
...state,
loading: false,
usernames: action.payload.usernames,
};
default:
return state;
}
}
export default reducer;
然后设置您的 thunk 和普通操作:
export const LOADING_USERNAMES = '[User] loading usernames';
export const USERNAMES_LOADED = '[User] usernames loaded';
export const loadingUsernames = () => ({
type: LOADING_USERNAMES,
});
export const usernamesLoaded = (usernames) => ({
type: USERNAMES_LOADED,
payload: {
usernames,
}
});
const getUsernameList = () => (dispatch) => {
dispatch(loadingUsernames()); // for the loading state
return fetch('https://jsonplaceholder.typicode.com/users')
.then(response => dispatch(usernamesLoaded(response.json())))
然后在你的 useEffect
钩子中任何你想初始化这个列表的地方,你调用 thunk:
dispatch(getUsernameList());
您可以决定不显示任何内容,只要加载为真且不存在任何列表,但在我看来,好的 UI 可以让用户知道正在发生某些事情。也许我没有正确理解你的问题,但这至少是我的方法。
你声明,你想要这个用于自动填充,所以在你的数据准备好之前不要显示表单,或者显示一个微调器。
我在设置 api 对初始状态对象的响应时遇到问题。
我已经尝试使用文档中所述的 useAsyncThunk,但是我正在处理的项目只允许我使用 redux-thunk。
目标是从 https://jsonplaceholder.typicode.com/users 下载用户名并使用它来创建一个自动填充输入字段来建议用户名。
我不明白你为什么要将你的用户名初始化为 initialState。这不是 redux 模式的工作原理。通常,您使用合理的空状态初始化您的商店:
const initialState = {
loading: false,
usernames: [],
}
const reducer = (state = initialState, action) => {
switch (action.type) {
case LOADING_USERNAMES:
return {
...state,
loading: true,
};
case USERNAMES_LOADED:
return {
...state,
loading: false,
usernames: action.payload.usernames,
};
default:
return state;
}
}
export default reducer;
然后设置您的 thunk 和普通操作:
export const LOADING_USERNAMES = '[User] loading usernames';
export const USERNAMES_LOADED = '[User] usernames loaded';
export const loadingUsernames = () => ({
type: LOADING_USERNAMES,
});
export const usernamesLoaded = (usernames) => ({
type: USERNAMES_LOADED,
payload: {
usernames,
}
});
const getUsernameList = () => (dispatch) => {
dispatch(loadingUsernames()); // for the loading state
return fetch('https://jsonplaceholder.typicode.com/users')
.then(response => dispatch(usernamesLoaded(response.json())))
然后在你的 useEffect
钩子中任何你想初始化这个列表的地方,你调用 thunk:
dispatch(getUsernameList());
您可以决定不显示任何内容,只要加载为真且不存在任何列表,但在我看来,好的 UI 可以让用户知道正在发生某些事情。也许我没有正确理解你的问题,但这至少是我的方法。
你声明,你想要这个用于自动填充,所以在你的数据准备好之前不要显示表单,或者显示一个微调器。