gpt4 book ai didi

reducers - 使用拆分 reducer 更新相关状态字段的最佳方法?

转载 作者:行者123 更新时间:2023-12-02 18:55:14 29 4
gpt4 key购买 nike

我正在尝试找到一种理想的方法来更新我的状态树上的几个顶级字段,同时仍然维护拆分 reducer 。

这是我想出的一个简单的解决方案。

var state = {
fileOrder: [0],
files: {
0:{
id: 0,
name: 'asdf'
}
}
};

function handleAddFile(state, action) {
return {...state, ...{[action.id]:{id: action.id, name: action.name}}};
};

function addFileOrder(state, action) {
return [...state, action.id];
}

// Adding a file should create a new file, and add its id to the fileOrder array.
function addFile(state, action) {
let id = Math.max.apply(this, Object.keys(state.files)) + 1;
return {
...state,
fileOrder: addFileOrder(state.fileOrder, {id}),
files: handleAddFile(state.files, {id, name: action.name})
};
}

目前,我可以分派(dispatch)单个操作 {type: ADD_FILE, fileName: 'x'},然后 addFile 在内部创建一个操作以发送到 addFileOrderaddFile

我很好奇这是否被认为是执行以下任一操作的更好方法。

而是分派(dispatch)两个操作,其中一个用于添加文件,然后获取其 ID 并使用该 ID 分派(dispatch)一个 ADD_TO_FILE_ORDER 操作。或者像 {type: ADD_FILE, name: 'x', id: 1} 这样的 Fire 和操作,而不是允许 addFile 计算新的 id。这将允许我使用 combineReducers 并过滤操作类型。这个例子可能很简单,但我的实际状态树有点复杂,添加的每个文件也需要添加到其他实体。

对于一些额外的上下文,更完整的状态树将如下所示。

{
"fileOrder": [0]
"entities": {
"files": {
0: {
id: 0,
name: 'hand.png'
}
},
"animations": {
0: {
id: 0,
name: "Base",
frames: [0]
}
},
"frames": {
0: {
id: 0,
duration: 500,
fileFrames: [0]
}
},
"fileFrames": {
0: {
id: 0,
file: 0,
top: 0,
left: 0,
visible: true
}
}
}
}

添加文件需要:

  1. 将其添加到文件哈希中。
  2. 将其添加到 fileOrder 数组中。
  3. 为每个框架添加一个引用文件的 fileFrame。
  4. 将每个新的 fileFrame 添加到为其创建的框架中。

最后两点让我想知道我是否能够使用combineReducers。

最佳答案

我最终找到了解决这个问题的一个非常简单的解决方案。

文档中的这两个 block 在功能上是相同的。

const reducer = combineReducers({
a: doSomethingWithA,
b: processB,
c: c
});

// This is functionally equivalent.
function reducer(state, action) {
return {
a: doSomethingWithA(state.a, action),
b: processB(state.b, action),
c: c(state.c, action)
};
}

我最终调整了第二个 block ,并且总是沿着我的全局状态树传递。只要一路上没有任何东西编辑状态,所有 reducer 都可以正常工作。

// Simple change to pass the entire state to each reducer.
// You have to be extra careful to keep state immutable here.
function reducer(state, action) {
return {
a: doSomethingWithA(state.a, action, state),
b: processB(state.b, action, state),
c: c(state.c, action, state)
};
}

关于reducers - 使用拆分 reducer 更新相关状态字段的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33321397/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com