Javascript 避免重复州名
假设我有一个如下所示的rootreducerJavascript 避免重复州名,javascript,reactjs,ecmascript-6,redux,Javascript,Reactjs,Ecmascript 6,Redux,假设我有一个如下所示的rootreducer const rootR = combineReducers({ topics, ... }); 主题减缩器 当我启动相关操作时,我会使用可重复属性state.topics.topics而不是state.topics 有没有办法避免这种重复(topics.topics) 提前谢谢你是双重嵌套的东西。topicsreducer将只看到状态的“topics”部分。因此,不要返回{…state,topics},只需执行返回topics 更新 你对问
const rootR = combineReducers({
topics,
...
});
主题减缩器
当我启动相关操作时,我会使用可重复属性state.topics.topics
而不是state.topics
有没有办法避免这种重复(topics.topics
)
提前谢谢你是双重嵌套的东西。
topics
reducer将只看到状态的“topics”部分。因此,不要返回{…state,topics}
,只需执行返回topics
更新
你对问题的编辑大大改变了情况
最初,您有:
function topics(state = {}, action){
现在,你有:
function topics(state = { topics=[], error: null}, action){
我承认我在这一点上有点困惑,你想要的状态结构实际上应该是什么
查看原始定义,您似乎误解了combinereducer
的工作原理,并且冗余地尝试返回包含名为“topics”的字段/切片的新对象。现在,看起来根级别的“topics”切片本身也有一个名为“topics”的字段
主题
和错误
是否应该位于状态树的根目录下?或者,它们真的都应该是顶级“主题”的一部分吗?如果这确实是您想要的,那么您已经将状态树定义为需要topics.topics
另外,要回答@free soul:no,在最初的示例中,
返回主题
不会改变状态,因为它只是返回动作中的任何内容。即使action.topic
字段实际上与以前处于状态的数组相同,结果也将是不可操作的。@markerikson是正确的,调用获取主题成功后,函数中传递的状态变量实际上是主题
,因此,最好在那里执行返回主题。
但是根据您的条件,您也可以执行returnObject.assign({},state,topics)
,而不是return{…state,topics}
。这将创建一个新对象,将以前状态的所有属性和主题合并在一起。查看主题
reducer的初始状态,可供主题
reducer访问的状态对象具有以下结构:
{
topics: [],
error: null
}
因此,当您像这样使用组合减速机时:
const rootR = combineReducers({
topics,
anotherReducer,
someOtherReducer.
// ...
});
{
topics: {
topics: [],
error: null
},
anotherReducer: {
// ...
},
someOtherReducer: {
// ...
},
// ...
}
生成的全局应用程序状态将如下所示:
const rootR = combineReducers({
topics,
anotherReducer,
someOtherReducer.
// ...
});
{
topics: {
topics: [],
error: null
},
anotherReducer: {
// ...
},
someOtherReducer: {
// ...
},
// ...
}
因此,如果您想从全局状态访问主题
数组,则需要执行状态.topics.topics
在状态下有两件事。topics
,一个topics
数组和error
。
因此,让我们将第二个主题
键重命名为项
,以避免混淆。
(不可避免地需要第二个键来存储数组,因为您还需要错误
)
因此,我们:
state.topics = {
items: [],
error: null,
}
现在我们访问的不是state.topics.topics
,而是state.topics.items
为此,传递给主题的initialstate必须为:
function topics(state = { items = [], error: null }, action){
//...
}
现在,在reducerFETCH\u TOPICS\u SUCCESSFULLY
中,我们希望将数组action.TOPICS
附加到项中,如下所示(不改变当前状态):
const{topics}=action
topics对象在这里看起来像什么?@finalfreq这是一个对象数组,像>{userId,theme,body}
我必须返回一个对象。现在我不处理这个错误,但我希望将来我会处理。这有意义吗?@markerikson,返回主题
将改变状态。同样,在最初的问题中,他有state.topics
一个对象,而action.topics
是一个数组。@markerikson,我想我不同意。topics
reducer可访问的状态为{topics:[item1,item2,…],错误:null}
。考虑<代码> Actudio。主题= [ITEM3,ITEM4] < /代码>。所以如果你做const{topics}=action
然后从reducer返回主题
,结果状态将为[item3,item4]
。状态变成一个数组,您将丢失主题
中先前的项目,也会丢失错误
。这有意义吗?@free-soul:我最初的回答基于原始示例代码,其中标记为topics
的state
参数是一个数组。无论哪种方式,返回主题
本身都不是“变异”,因为“变异”是对现有对象或数组引用的直接修改topics.push()
就是一个“变异”的例子。