我是React,React Native和Redux的新手,所以我试图在过去的几天里围绕着这些新闻概念。
我现在遇到的一个问题是在Action Creator中计算新数据,然后将其包装在action对象中并传递给reducer,这需要来自状态树中其他分支的一段数据。你通常会怎样解决这个问题?更改全局状态树的结构或将此数据映射到需要它的组件?
鉴于状态树:
{
ListView:{
dataSource : a ListView.DataSource type
}
SubmitForm:{
title : 'name of title',
text : 'description'
}
isFetchingData: true/false
}
据说,每个分支都由不同的reducer处理,每个分支的数据作为props传递给单独的组件。
这是一个场景(我正在使用Redux将React tutorial翻译为React Native):
所以我的想法是Form组件不应该有一个名为dataSource的prop,因为它来自状态树中的另一个分支。但没有它,我不确定如何实现所需的dataSource。对于我对Redux模式的理解,更改(在这种情况下合并ListView和SubmitForm)状态树的结构也会很奇怪。那么有人可以帮我解决这个问题吗?感谢
答案 0 :(得分:2)
谢谢你们。我认为我通过使用redux-thunk找到了最好的解决方案(我实际上是使用redux-thunk来处理异步操作,但是没有充分读取api)。基本上thunk也注入了getState,所以基本上调用getState()会让我访问全局状态树,这应该可以解决我的问题。
const actionCreator = (args) => {
return (dispatch,getState) => {
// dispatch action to notify store that data is being sent
fetch(url)
.then((response) => response.json())
.then((resData) => {
// dispatch action to notify data received
// compute new data using resData and current dataSource accessed by getState().ListView.dataSource
})
}
}
答案 1 :(得分:1)
之前我曾想过这个问题,我认为这可能是一种方式。
例如。 你有actionA,reducerA和storeA的商店。 你有actionB,reducerB和storeB的branchB。
现在您想要同时读取branchA和branchB并更改它们。
好的,让我们定义两个动作。
一个在actionA(sub-actionA)中,用于更改branchA。 另一个在actionB(sub-actionB),它改变了branchB。
然后,定义一个总动作(total-action),它将按顺序调用sub-actionA和sub-actionB。
最后一个问题是“如何读取子动作A中的branchB”。
好的,我们可以使用store的'getState'方法。
我们将商店导入actionA,然后调用
store.getState()
它将返回整个商店树。
答案 2 :(得分:1)
这是一个常见问题,在Redux常见问题解答中方便地给出答案:http://redux.js.org/docs/FAQ.html#reducers-share-state。
简短版本:combineReducers
解决了按域/切片状态拆分缩减器功能的简单用例。您已经过去了,现在需要添加自定义的附加顶级reducer逻辑来处理此操作,或者在操作本身中包含其他所需的数据。