2016-03-15 78 views
5

我一直在我的React应用程序中使用Redux,并且一直在困扰着我。 Redux的文档清楚地表明减速器应该是无状态的。你经常看到这样的例子:为什么Redux减速器必须是无副作用的?

function reducer(state = { exampleState: true }, action) { 
    switch(action.type) { 
    case "ACTION_EXAMPLE": 
    return Object.assign({}, state, { exampleState: false }); 
    default: 
    return state; 
    } 
} 

我的问题是为什么这是必需的? JavaScript是单线程的。减速器内部不存在竞赛状况的可能性。据我所知,一个Redux商店只能够返回商店的当前状态,所以看起来奇怪的是,对纯功能的关注太多了。

+1

不好意思,“减速机内部没有比赛条件的机会”是什么意思? – FurkanO

+0

https://goshakkk.name/redux-side-effect-approaches/ – zloctb

回答

6

的情况下为纯函数在作者的documentation而成。当然,你可以写不纯功能减速,但:

发展的功能,比如时间旅行,记录/回放,或热重装将打破。

如果没有这些功能提供益处,或者是感兴趣的你,然后,通过各种手段,写不纯的功能。然而,这个问题会变成什么样,为什么要使用Redux?

+0

感谢布雷特,我不知道这些功能。 – Max

2

仅仅因为它是单线程的,并不意味着它不是异步的,但是这真的没有那么重要。副作用与线程无关,一切都与确保您的对象按其API说明的方式行事有关:如果它具有状态,则可能会有不同的行为,具体取决于调用的次数以及数据是什么传递给每个调用,而不是一个具有持续行为的对象,无论何时调用它。

重要的部分是“对于完全相同的输入,其行为方式完全相同”。添加和使用状态几乎是字面上的承诺,情况并非如此。

+0

对不起,这不回答问题。所有这些东西都可以修改状态目录。考虑这样做的reducer:'(state,action)=> {state.prop + = 1;返回状态; }'。这不是免费的副作用,但取决于多少次呼叫,它会有不同的行为。 – Max

+0

你只是字面上描述了一个不可预知的副作用。您刚刚更新了商店不拥有的对象:对象的所有者刚刚发生了什么?这个“道具”的价值奇迹般的改变了,那会有什么后果呢?为什么你甚至会认为你知道其他对象是否也可以这样做,包括你甚至不知道任何事情的代码(模块等)?不要编写带有副作用的代码,因为充其量只是你,但最坏的情况是,每个人使用你的代码,都不会理解它们的影响,并且不能依赖代码行为的确定性预测 –

+0

@Max“it将取决于进行多少次呼叫而具有不同的行为“如果每次调用所做的每个调用,使用相同的输入都会以相同的可预测和可重复的方式更改状态,则不会产生副作用。编辑:另外,你永远不应该对状态对象本身进行操作。这是一个不是的 –

1

因为 '预知'

Redux is a predictable state container for JavaScript apps.

重点。

增加副作用使得预见

+1

您可以在行为如何变得无法预测时添加一些理由吗? – Max

+0

好的。让我们说,无论出于什么原因,你在你的reducer中添加一个XHRequest,在成功的时候,对'state'进行修改。你只是让你的减速器变得不可预知,因为现在你不能保证每次你的减速器被执行相同的确切输入时,它总会以相同的可预测的方式改变状态。 (因为如果XHRequest失败会怎么样?) –

+0

当然,你不想在reducer中做一个AJAX调用。但这并不意味着减速器**必须是无副作用的。你的例子表明减速器应该是确定性的。 – Max

相关问题