我试图避免在状态缩减器中调用dispatch,而且我不确定redux-thunk是否是我需要的解决方案

时间:2019-08-17 01:56:55

标签: redux redux-thunk

我对使用Redux还是陌生的,但是基本上我是在为学习项目创建一个javascript科学计算器,而且我不确定自己是否步入正轨。基本上,计算器将使用数组形式的堆栈,在表达式内用括号将分组表示为对堆栈中包含括号中包含的表达式的另一个元素的引用。

例如,3 * (4 + 1)/5 + ln(6+8)将由

表示
[
  [4, '*', 'ref:1', '/', 5, '+', 'ln', 'ref:2'], 
  [4, '+', 1], 
  [6, '+', 8]
]

我正在创建各种异径管以处理不同的工件。例如,一个化简器将处理将加法运算符添加到堆栈中,而另一个则将处理将数字加法运算到堆栈中。 (在添加了它们各自的元素之后,每个化简器将调用Redux存储库中不包含的两个函数来处理呈现输入和将输出评估/呈现为字符串,这也是状态对象的一部分。)

现在很明显,如果用户按下例如数字2,而最后一个元素是数字3,那么结果将是将该元素转换为数字32。但是,如果最后一个元素是2,则用户按下pi键,然后我想添加一个'*'运算符,然后添加3.14159。

现在,让数字化简器处理添加'*'运算符是没有意义的,并且我从this question中了解到,从化简器调用调度被认为是“反模式”。是Redux-Thunk介入的地方,还是我应该考虑的其他解决方案?

此外,我正在读this article,但当他们说两个化简不能共享状态片时,我不太确定它们的意思。单个切片到底是什么?在CombineReducers函数中,一个切片与另一个切片有何区别?

1 个答案:

答案 0 :(得分:0)

因此,在学习了似乎永远无法学习的中间件和redux-thunk之后,我想出了一个解决方案。我现在意识到,整个堆栈需要由单个化简器处理,但是为了解决在化简器中使用上述递归的问题,我创建了一个返回函数的动作创建器:

Function addElement(element)
{
  return (dispatch, getState) => {
    dispatch(addToStack(element));
    while (getState().stack.hasOwnProperty('elementsToBeDispatched'))
    {
      dispatch(addToStack(elementsToBeDispatched[0]));
    }
}

很抱歉有任何错别字,我正在手机上写出来。