如何使用Redux React Native中来自状态树的不同分支的元素来计算数据?

时间:2016-04-10 07:03:35

标签: react-native redux react-redux

我是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):

  1. 在SubmitForm中单击“提交”按钮
  2. - >发送一个动作来通知商店正在发送数据,然后异步抓取并将{title,text}发送到API服务器。
  3. 成功后--->计算从API服务器返回的dataSource,并将结果dataSource传递给reducer(根据教程)。通过计算dataSource,我的意思是dataSource.cloneWithRows(....)(解释here),它需要ListView中的dataSource,如上所示。
  4. 所以我的想法是Form组件不应该有一个名为dataSource的prop,因为它来自状态树中的另一个分支。但没有它,我不确定如何实现所需的dataSource。对于我对Redux模式的理解,更改(在这种情况下合并ListView和SubmitForm)状态树的结构也会很奇怪。那么有人可以帮我解决这个问题吗?感谢

3 个答案:

答案 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逻辑来处理此操作,或者在操作本身中包含其他所需的数据。