Redux请参阅Reducer中的其他状态
Redux see other state from Reducer
想象一个UI有两个React组件:
<FilterContainer />
<UserListContainer />
我们从服务器上取下一组用户:
[
{
name: 'John',
enjoys: ['Sailing', 'Running']
},
{
name: 'Bob',
enjoys: ['Running', 'Eating']
},
{
name: 'Frank',
enjoys: ['Sailing', 'Eating']
}
]
UI看起来有点像:
过滤器:航行跑步进食
用户列表:
约翰·
Frank
您可以单击过滤器或用户。为了进入这个阶段,我们点击了"帆船",然后点击了"弗兰克"(也许我们在屏幕中间看到了弗兰克的一张漂亮照片)。
使用combineReducers
构建的我的Redux状态如下:
{
ui: {
filter: {enjoys: 'Sailing'},
userList: {selected: 'John'}
}
data: [user array]
}
我有两个动作,SELECT_USER
和SELECT_FILTER
。
当我点击过滤器(SELECT_FILTER
激发)时,如果该用户仍在过滤器中,我希望ui.userList.selected
保持不变,如果用户不在过滤器中则ui.userList.selected
设置为null。
因此,如果我现在点击"吃",我会看到一个列表,其中包含Bob和Frank,Frank被选中。但如果我点击跑步,我会看到约翰和鲍勃,但他们都没有被选中。
然而,我在传统的Redux方法中很难做到这一点。当userList
reducer看到SELECT_FILTER
动作时,它无法检查data
状态以查看当前所选用户是否仍处于该筛选条件。
做这件事的正确方法是什么?
function filter(state = {enjoys: null}, action) {
switch (action.type) {
case SELECT_FILTER:
return {
...state,
enjoys: action.enjoys
}
default:
return state
}
}
function userList(state = {selected: null}, action) {
switch (action.type) {
case SELECT_USER:
return {
...state,
selected: action.name
}
default:
return state
}
}
const ui = combineReducers({
filter,
userList
})
let initialUsers = [
{
name: 'John',
enjoys: ['Sailing', 'Running']
},
{
name: 'Bob',
enjoys: ['Running', 'Eating']
},
{
name: 'Frank',
enjoys: ['Sailing', 'Eating']
}
]
const rootReducer = combineReducers({
ui,
data: (state=initialUsers) => state // in reality, loaded from server
})
export default rootReducer
Reducer应该只知道状态的一小部分。
动作创造者是描述逻辑的好地方。使用redux-thunk,您将能够根据全局状态做出决定。
function selectFilter(enjoys) {
return (dispatch, getState) => {
dispatch({type: SELECT_FILTER, enjoys});
// if getState().ui.userList.selected exists in getState().data
dispatch({type: SELECT_USER, name: null});
}
};
您需要另一个操作。
如果您在数据缩减器中筛选用户,则当您检测到用户数组已更改时,需要在组件的某个挂钩(componentWillUpdate或componentWillReceiveProps)中调度一个操作。此操作将为您的筛选器reducer提供当前的用户数组,您可以在那里随意设置所选字段。
如果您正在筛选服务器中的用户,我想您已经有了一个类似FETCH_users_SUCCESS的操作可以用于此操作。
它应该由过滤器还原器处理。您需要将数据作为操作负载的一部分发送给用户。因此,reducer可以计算所选的用户逻辑。您应该考虑添加一个新的操作,正如@cuttals建议的那样。
- Web应用程序,将成员状态更新为其他成员
- 添加:在悬停其他elem时,将悬停状态添加到不同elem
- PJAX:记住其他对象状态
- 更改为其他状态时保持状态
- 如何在第一次点击时突出显示链接;并在第二次单击时跟随它,除非在其他地方单击,然后重新初始化未高亮显示的状态
- 在益智游戏中,如何使可移动瓷砖的悬停为红色,而其他瓷砖保持原始状态
- 在两个或多个 UL 列表之间切换,如果单击一个列表,则其他列表会自动以初始状态返回,就像从未单击过一样
- 如果其他状态无法正常工作
- 仅当单击其他按钮时,才使按钮处于非活动状态
- 当其他元素处于活动状态时,jQuery 不显示隐藏元素
- 尝试执行 a:active 以保持打开状态,直到单击其他链接
- 复选框状态和其他属性
- 需要显示其他字段的实时状态
- Redux请参阅Reducer中的其他状态
- 如何在其他链接处于活动状态时取消其他链接的粗体显示
- 处理$.ajax请求中的其他状态代码
- 鼠标停留在一个状态上,用d3地图改变其他状态的颜色
- Angular UI路由器-从其他状态访问statesparams
- $state.go()不路由到其他状态,#/null在url
- BootstrapJQuery加载状态自动禁用按钮,如何让其他状态也这样做