例如,假设我们有一个名为game
的切片状态。在game
下,我们有两个实体,enemies
和items
。每个实体都有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
减速器中,我们有两个选择器分别获取可见的敌人和物品。他们在game
和enemies
中委托选择器功能,因为我不想让items
知道game
和enemies
的状态树详情:
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)只需在客户端代码中直接调用game
和enemies
的选择器,例如(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)
中的getVisibleEnemies
和game.js
中的getVisibleEnemiesImpl
:没关系,但我想知道应该有更好的方法来解决这个问题。
那你会做什么?
答案 0 :(得分:1)
我认为你应该选择(3)但是: