为什么我的减速机返回错误的状态,尽管在我注销时一切看起来都正确?

时间:2017-12-03 18:40:03

标签: reactjs redux

我是redux的新手,并尝试构建一个简单的应用程序,用户可以在其中投票选择自己喜欢的前端框架。我希望有一个用户单击以投票的工作流程,这将调度投票操作。在投票行动之后,将触发一个不同的行动来计算每个框架的总投票百分比。

我的商店/减速机设置如下:

module SOANS =

   open System

   let firstArray  = [|0.02;0.03;0.05;0.07;0.11|]
   let secondArray = [|0.30;0.50;0.70;1.10;1.30|]
   let lenSecondArray = secondArray.Length
   let thirdArray = Array.permute (fun index -> (index + (1)) % lenSecondArray) secondArray
   thirdArray.[0] <- 0.00
   let constant    = 0.37

   let result = Array.map3 (fun x y z -> (if y < 1.00 then (x - (constant * (y - z))) else 0.00)) firstArray secondArray thirdArray

   printfn "Result: %A" result

   (*
      Expected Result: [|-0.091;-0.044;-0.024;0;0|]
      Actual Result:   [|-0.091;-0.044;-0.024;0;0|]
   *)

我的点击处理程序触发了初始“投票”动作,这反过来触发了“计算百分比”动作。它们看起来像这样:

Get-GroupMembershipLocal([string] $UserName)
{
    $strComputer = $Env:ComputerName
    $User = [ADSI]("WinNT://$strComputer/$UserName,user")

    $Groups = @()
    $User.psbase.Invoke("groups") |foreach `
    {
      $groupname = [string] $_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null)
      $Groups += $groupname
    }
    return ,$Groups
}

$Groups = Get-GroupMembershipLocal "SomeUserName"
Write-Host ($Groups | Out-String)

动作创作者:

const combinedReducers = combineReducers({
    "votes": votesReducer,
    "currentPercentages": currentPercentageReducer,
    "pastPercentages": pastPercentageReducer
});

let store = createStore(combinedReducers, applyMiddleware(thunk));
store.subscribe(() => {
    console.log('store state is', store.getState())
})

ReactDOM.render(
    <Provider store={store}>
        <App />
    </Provider>, 
    document.getElementById('root')
);

最后 - 问题的核心。我的reducer处理更新当前投票百分比。

//click handlers

votedAngular(){
    this.props.dispatch(castVote('angular'));
}

votedReact(){
    this.props.dispatch(castVote('react'));        
}

votedVue(){
    this.props.dispatch(castVote('vue'));
}

有人可以解释一下这里发生了什么吗?

1 个答案:

答案 0 :(得分:2)

我怀疑这里发生的是Math.floor总是为分数返回0。在您的第一次投票中,您获得Math.floor(1/1) = 1,但在下次投票时,您可能会获得Math.floor(1/2) = 0。您能否确认如果您的前两张选票是针对相同的框架,您会看到正确的结果吗?请尝试使用Math.round(num * 100) / 100