当状态树的两个分支具有相同的选择器名称时,如何管理redux选择器?

时间:2016-08-14 04:41:08

标签: javascript redux react-redux

例如,假设我们有一个名为game的切片状态。在game下,我们有两个实体,enemiesitems。每个实体都有x坐标来记录它的位置。状态树看起来像这样:

{
  game: {
    enemies: {
      allEnemies: [
        {
          id: 1,
          x: 100,
        },
        {
          id: 3,  
          x: 300,
        }
      ],
      allEnemiesById: [1, 3],
    },
    items: {
      allItems: [
        {
          id: 2,
          x: 200,
        },
        {
          id: 7,
          x: 500,
        }
      ],
      allItemsById: [2, 7],
    }
  }
}

当然,enemy实体和item实体将具有其他不同的属性。 <{1}} reducer中还有其他逻辑,所以我不能简单地删除它。

现在,在game减速器中,我们有两个选择器分别获取可见的敌人和物品。他们在gameenemies中委托选择器功能,因为我不想让items知道gameenemies的状态树详情:

items

reducers/game.js

但现在的问题是:import { enemies, selector1 } from './enemies.js'; import { items, selector2 } from './items.js'; const getVisibleEnemies = (state) => selector1(state.enemies) const getVisibleItems = (state) => selector2(state.items) selector1的名称应该是什么?我想过一些解决方案,但我不太满意:

(1)selector2:但我们在getVisibleEntities中不能有两个相同的函数名称;

(2)game:但这与getVisibleXXX中的选择器名称相同。

(3)只需在客户端代码中直接调用gameenemies的选择器,例如(items中的getVisibleEnemies(state.game.enemies)):但现在调用者必须知道深度状态树的形状,一旦状态树改变,改变它们将是痛苦的。

(4)将选择器绑定在reducer函数中,例如:

mapStateToProps     export const getVisibleEntities(state)=&gt; {       //为敌人实施getVisibleEntities     }

reducers/enemies.js

export const enemies = (state = initialState, action) { // main reducer of enemies } enemies.getVisibleEntities = getVisibleEntities     export const getVisibleEntities(state)=&gt; {       //为项目实现getVisibleEntities     }

reducers/items.js

export const items = (state = initialState, action) { // main reducer of items } items.getVisibleEntities = getVisibleEntities

reducers/game.js

但我不确定在状态减速器上将selector设置为属性是否是个好主意。

(5)给它一个略有不同的名称,例如export const getVisibleEnemies = (state) => enemies.getVisibleEntities(state.enemies) export const getVisibleItems = (state) => items.getVisibleEntities(state.enemies) 中的getVisibleEnemiesgame.js中的getVisibleEnemiesImpl:没关系,但我想知道应该有更好的方法来解决这个问题。

那你会做什么?

1 个答案:

答案 0 :(得分:1)

我认为你应该选择(3)但是:

  • 您的选择器应该是整个Redux商店状态的函数
  • 通过这种方式,您的容器(智能组件)不必了解州树的深层形状