Javascript (react) 计算器取决于中间值

Javascript (react) calculator depends on in between values

我正在尝试制作一个简单的(可能)反应计算器,运费增加取决于距离。但我现在确实堆积如山。
假设这辆车每次都会从市中心开到郊区。汽车将从起点取走包裹并将其运送到终点。离市区越远,单价越高mile\km.

我的变量:x:起点,y:终点,n:每 1 的成本 mile\km(n = 1,2,3 只是为了更好的解释,所以 n+1 在这里不起作用,稍后我想将其更改为 .24 cents\points 或其他)

预期结果:


示例:如果 x = 10, y = 25 那么成本 = 30 $ \ 点 \ 随便 (5 + 10 + 15 => 因为介于 (
5 和 15) n = 1, 在 (
之间 15 和 20) n = 2 和介于 (
20 和 25) n = 3 ..如果我们要走更长的距离,依此类推)

实际结果:取决于<=和&&或|| “if”中的语句正在计算成本..


第一个例子:取决于更高的价格 (n),所以玩家将被收费..就像他从更高、最有价值的距离开始(如果 x = 10,y = 25 那么成本 = 45 因为 n 在 20 和 25 之间 = 3)
第二个例子:取决于较低的价格(x = 10,y = 25 => 成本 = 15)
可能我遗漏了一些反应或一些数学逻辑,但无法意识到我到底需要做什么,我在我的宠物项目的这一部分浪费了很多时间,所以这是有史以来第一次我正在寻求帮助 :) 感谢您的提前!

我也不明白为什么有时我需要点击按钮两次来更新 useState..

我为您准备的代码沙箱https://codesandbox.io/s/distance-react-calc-on-states-rjuek

如果您想在此处查看代码:

import React, { useState } from "react";
import ReactDOM from "react-dom";
import "./styles.css";

function App() {
  const [x, setX] = useState(5);
  const [y, setY] = useState(10);
  const [n, setN] = useState(null); // n - the cost value per 1 mile/km
  const [total, setTotal] = useState((y - x) * n);

  function calculateTotal() {
    if (x <= 5 && y < 15) {
      setN(1);
      setTotal((y - x) * n);
    } else if (x <= 15 && y < 20) {
      setN(2);
      setTotal((y - x) * n);
    } else if (x <= 20 && y <= 25) {
      setN(3);
      setTotal((y - x) * n);
    } else if (x <= 25 && y < 30) {
      setN(4);
      setTotal((y - x) * n);
    } else if (30 <= x && y < 35) {
      setN(5);
      setTotal((y - x) * n);
    } else if (35 <= x && y < 40) {
      setN(6);
      setTotal((y - x) * n);
    }
    return calculateTotal;
  }

  return (
    <div className="Calc">
      <div className="number-inputs">
        <input
          type="number"
          step="1"
          value={x}
          onChange={(e) => setX(+e.target.value)}
        />
        <input
          type="number"
          step="1"
          value={y}
          onChange={(e) => setY(+e.target.value)}
        />
      </div>

      <button onClick={calculateTotal}>Calc</button>

      <h2 id="currentDistance">{total}</h2>
    </div>
  );
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
 setN(1);
 setTotal((y - x) * n)

React 以虚拟 DOM 的思想工作,因此即使你将两个 set 函数一个接一个地放在上面,到 setTotal((y - x) * n) 执行时 n 值可能是之前的状态是 null。这就是你需要按两次按钮的原因。

因此,假设您不会在前面的语句中立即获得该值,那么编写任何使用 setState 的逻辑。

例如:

 setN(1);
 setTotal((y - x) * 1)