gpt4 book ai didi

javascript - 使用 redux 和 thunk 返回嵌套状态

转载 作者:行者123 更新时间:2023-11-28 17:36:19 24 4
gpt4 key购买 nike

我对 redux 和 thunk 相当陌生,并且一直在遵循教程来尝试和理解,并且正在设法将其应用到我的应用程序中。我不明白的一件事是如何将根级别上的多个状态对象放入一个嵌套对象中。例如,现在我的状态如下:

{
timeline: [Array] // My timeline data in an array of objects
timelineHasErrored: false,
timelineIsLoading: false
}

但我真正想要的是:

{
timeline : {
data: [Array] // My timeline data in an array of objects
hasErrored: false,
isLoading: false
}
}

而且我真的不太确定如何嵌套这些,或者正确的方法是什么。下面是我的 redux 代码,它非常简单,所以我将全部发布。

reducer 索引

import { combineReducers } from 'redux'
import { timeline, timelineHasErrored, timelineIsLoading } from './timeline'

export default combineReducers({
timeline, timelineHasErrored, timelineIsLoading
});

时间线缩减

import { TIMELINE_HAS_ERRORED, TIMELINE_IS_LOADING, TIMELINE_FETCH_DATA_SUCCESS } from '../constants/action-types.js'

export function timelineHasErrored(state = false, action) {
switch (action.type) {
case TIMELINE_HAS_ERRORED:
return action.hasErrored;
default:
return state;
}
}

export function timelineIsLoading(state = false, action) {
switch (action.type) {
case TIMELINE_IS_LOADING:
return action.isLoading;
default:
return state;
}
}

export function timeline(state = [], action) {
switch (action.type) {
case TIMELINE_FETCH_DATA_SUCCESS:
return action.timeline;
default:
return state;
}
}

操作

import { TIMELINE_HAS_ERRORED, TIMELINE_IS_LOADING, TIMELINE_FETCH_DATA_SUCCESS } from '../constants/action-types.js'
import api from '../services/api'

export function timelineHasErrored(bool) {
return {
type : TIMELINE_HAS_ERRORED,
hasErrored : bool
}
}

export function timelineIsLoading(bool) {
return {
type : TIMELINE_IS_LOADING,
isLoading : bool
}
}

export function timelineFetchDataSuccess(timeline) {
return {
type : TIMELINE_FETCH_DATA_SUCCESS,
timeline
}
}

export function timelineFetchData() {
return dispatch => {
dispatch( timelineIsLoading(true) )

api.getTracks().then(
res => {
dispatch( timelineIsLoading(false) )
dispatch( timelineFetchDataSuccess(res.body) )
},
err => {
dispatch( timelineIsLoading(false) )
dispatch( timelineHasErrored(true) )
}
)
}
}

然后在我的 react 组件中,我按照我想要的方式格式化对象...但我认为最好将其嵌套在实际状态中,这样如果情况发生变化,我不会为自己创建额外的工作

// Redux State
const mapStateToProps = (state) => {
const obj = {
timeline : {
data : state.timeline,
hasErrored: state.tracksHasErrored,
isLoading: state.tracksIsLoading
}
}

return obj
}

// Redux Dispatch
const mapDispatchToProps = (dispatch) => {
return {
fetchData: () => dispatch( timelineFetchData() )
}
}

如果有人对我有任何提示或更正,请告诉我,我正在努力牢牢掌握 redux,谢谢!

最佳答案

您的时间轴 reducer 非常小,因此您可以将其作为单个 reducer ,如下所示:

const initialState = {
data: [],
hasErrored: false,
isLoading: false
};

export function timeline(state = initialState, action) {
switch (action.type) {
case TIMELINE_HAS_ERRORED:
return {
...state,
hasErrored: action.hasErrored
};

case TIMELINE_IS_LOADING:
return {
...state,
isLoading: action.isLoading
};

case TIMELINE_FETCH_DATA_SUCCESS:
return {
...state,
data: action.timeline
};

default:
return state;
}
}

那么你就不需要调用combineReducers(),除非你有其他reducer。

关于javascript - 使用 redux 和 thunk 返回嵌套状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49075632/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com