当前位置: 首页 > 知识库问答 >
问题:

了解减速器动作的排列方式

墨阳羽
2023-03-14

作为挂钩新手,我正在转换一些具有多个状态属性的旧代码,在搜索如何减少最初设置的useState挂钩数量时,我遇到了这段代码(失去了链接)。以下useReducer钩子代码按预期工作。我想我知道state值是通过setState(dispatch)更新的,我想弄清楚的是reducer的第二个参数是如何使用spread语法在state和newState之间复制值的。我看到的所有示例都使用switch语句和各种返回新状态的操作。React是不是在后台做了些什么来实现这个复制?如果有人能解释。。。newState作为减速机的作用,我们希望:

const reducer = (state, newState) => ({ ...state, ...newState });
const [state, setState] = useReducer(reducer, initialState);

共有2个答案

邢高澹
2023-03-14

在您的示例中,更像是分离减速器。当你只有一个动作时,会有点困惑。

试着在你的例子中再添加一个动作,你会得到这个:

const reducer = (state, newState) => ({ ...state, ...newState });
const [state, setState] = useReducer(reducer, initialState);
const reducer1 = (state, newState) => ({ ...state, ...newState });
const [state1, setState1] = useReducer1(reducer1, initialState1);

如果你按照你提到的方法来做,你可以这样做:

const initialState = {someprops, type:1};//you have to sepecify type in state
    const reducer = (state, newState) => {
     switch(state.type){
    case 1:
     return { ...state, ...newState };
    case 2:
    //do something else
     return { ...state, ...newState };
    };
    const [state, setState] = useReducer(reducer, initialState);
苍意智
2023-03-14

通常减速机内部有开关语句,但这不是要求。Reducer只是一个函数,它将以前的输入作为第一个参数,将操作(类型和负载)作为第二个参数,并返回相同的状态(如果没有条件匹配)或新状态。但不需要使用switch语句。所以,在这个减速机中,您要做的是,当第二个参数在前一个状态中被合并时,所传递的内容。

const reducer=(state,newState)=

const reducer = (state, newState) => {
    return { ...state, ...newState };
}

例如

const initialState = { a: 1, b: 2 };

关于建立新的国家,,

setState({ b: 3, c: 4});

将以前的状态(初始状态)和上面的对象作为第二个参数调用还原器,还原器将返回合并后的状态

{ ...initialState, ...newState } // pseudo code
{ ...{a: 1, b:2 }, ...{ b:3, c: 4} }
{ a: 1, b: 3, c: 4 } // returned result
 类似资料:
  • 我有下面的状态和减缩器,但它没有推入新的数组对象。 照片未被推送,但被覆盖

  • 我很难理解quicksort,大多数演示和解释都忽略了实际发生的事情(例如http://me.dt.in.th/page/quicksort/)。 维基百科说: 从数组中选择一个称为透视的元素。分区:对数组重新排序,使所有值小于pivot的元素都在pivot之前,而所有值大于pivot的元素都在pivot之后(相等的值可以从任何一个方向走)。分区后,枢轴处于其最终位置。这称为分区操作。将上述步骤递

  • 问题内容: 是否可以在减速器本身中调度动作?我有一个进度栏和一个音频元素。目标是在音频元素中的时间更新时更新进度条。但是我不知道在哪里放置ontimeupdate事件处理程序,或者如何在ontimeupdate的回调中分派操作以更新进度条。这是我的代码: 问题答案: 在减速器内调度动作是一种反模式 。减速器应该没有副作用,只需消化操作有效负载并返回新的状态对象即可。在Reducer中添加侦听器和调

  • 以下是您将看到的一些方法的快速描述: > :返回船的边界(一个矩形) :返回表示船边界中心的Vector2d。 :一个,它表示船的速度(每帧添加到位置) :一个新的,当给定一个角度(以弧度为单位)时,将其标准化 :不是线性插值!如果你想看代码,这里是(在类中): 当玩家没有按键时,飞船应该减速。以下是我为此所做的: 然而,现在我意识到我希望它在向目标移动时漂移。我试过这个: 这当然不会真的达到零速

  • 我有一个逻辑问题,我是否应该对操作中的每个回调进行多个函数调用: 或者我可能想把这些调用转移到redux减速机中,然后从那里调用下一个函数? 第二种方法在我看来像是反模式,会产生意大利面条式的代码...也许我错了?

  • 按照我的理解,当一个动作被调用时,所有的减速器都响应。如果action存在于reducer的语句中,则执行action。如果没有,则执行,保留现有状态。 当操作存在于reducer中,但它试图更新的特定属性不存在时,它似乎表现良好,因为没有什么可更新的。 例如,我有一个action creator,用于设置Modals的属性。每个模式都有自己的。我的代码如下所示: 我在多个精简器中都有,但是如果没