Javascript 避免重复州名

Javascript 避免重复州名,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 更新 你对问

假设我有一个如下所示的rootreducer

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是正确的,调用
获取主题成功后,函数中传递的
状态变量实际上是
主题
,因此,最好在那里执行
返回主题。

但是根据您的条件,您也可以执行return
Object.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){
    //...
}
现在,在reducer
FETCH\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()
就是一个“变异”的例子。