2016-09-30 25 views
5

对于给定的减速,我的终极版状态树通常看起来是这样的:如何更新Redux的状态进一步下跌的树

{ 
    someField: 'some value', 
    // ... more fields 
    metadata: { 
    pending: false, 
    fetched: true, 
    } 
} 

通常情况下,当我做一个异步请求,我火SOME_ACTION_REQUEST动作,这将metadata.pending属性设置为true。当匹配的SOME_ACTION_RESPONSESOME_ACTION_ERROR事件稍后再次涓流时,它会重新设置为false。

不过,我更新状态的方法是有点冗长:

case actions.SOME_ACTION_REQUEST: { 
    return { 
    ...state, 
    metadata: { ...state.metadata, pending: true }, 
    }; 
} 

是否有这样做的一个简单的方法?

Object.assign({}, state, { metadata: { pending: true } })也不是很可读。

+2

的可能的复制[清洁剂/短的方式来更新在Redux的嵌套状态?](http://stackoverflow.com/questions/35592078/cleaner-shorter-way-to-update -nested - 状态 - 在-终极版) –

回答

1

你可以去减速机的嵌套结构。

其中有一个函数/ reducer命名元数据,调用它来更改字段。

实施例代码

const metadata = (state = [], action = {}) => { 
    switch (action.type) { 
     case actions.SOME_ACTION_REQUEST:: 
      return {...state, ...action.payload.metadata}; 

     default: 
      return state; 
    } 
}; 
const someReducer = (state = initalState, action = {}) => { 
    let metadata = {}; 
    switch (action.type) { 
     case actions.SOME_ACTION_REQUEST: { 
      metadata = metadata(state.metadata, action) 
      return { 
       ...state, 
       ...metadata 
       }; 
      } 
    } 
}; 
0

是的,这实际上是Redux的缺点,不仅如果你使用MobX,你会遇到同样的问题。所以,答案只是以某种方式推广它 - 编写一个reducer工厂,它将获取常量作为参数,并将它们合并一次,然后将其用于所有异步操作。

I've created a library正是这个问题,所以随时看看它。另外,请记住,原始的Redux无论如何都是相当详细的,并尝试以最佳方式掌握您的域模型。 你的例子看起来像:后自动应答将得到从最后选择

import { createTile } from 'redux-tiles'; 

const someTile = createTile({ 
    type: ['some', 'example'], 
    fn: ({ api, params }) => api.get('/some/request', params), 
}); 

dispatch(actions.some.example(params)); 
selectors.some.example(state)); // { isPending: true, error: null, data: null } 

数据将被更新 - 因此无需手动写这样的东西。

另一个问题是嵌套更新,你必须做同样的事情,但更多的冗长,我总是试图解决。但是,当然,它是一个非常简单的库,它只尝试覆盖简单的用例 - 对于复杂的用例,我绝对推荐您尝试一些定制的。

相关问题