Мое приложение для реагирования не рассчитывается должным образом (только после того, как второй символ отображает результат)

avatar
andsemenov
8 августа 2021 в 18:01
29
1
1

Я работаю над реагирующим приложением. Он имеет кнопку Добавить, чтобы добавить строку для расчета объема. Каждая строка содержит 2 поля ввода значений толщины и площади поверхности соответственно. Я заметил, что если толщина введена и пользователь начинает вводить площадь поверхности, объем будет отображаться только после второго символа.

Например, толщина - введено 100, поверхность - 1 и объем 0 (ожидается 0,1). Затем поверхность - 10 и объем 1 (как и ожидалось). То же самое, если введена поверхность 100 и толщина 1 --> объем 0 (ожидается 0,1).

Может кто-нибудь объяснить, как решить проблему, пожалуйста? Спасибо за помощь.

codesandbox

import { useState } from "react";
const App = () => {
  const [datas, setDatas] = useState([]);
  const handleChange = (index) => (event) => {
    let currentValue = +event.target.value;
    if (event.target.name === "thickness") {
      let newArr = [...datas];
      newArr[index] = { ...newArr[index], thickness: currentValue };
      if (datas[index].thickness && datas[index].surface) {
        newArr[index] = {
          ...newArr[index],
          volume: (currentValue * newArr[index].surface) / 1000,
        };
      }
      setDatas(newArr);
    }
    if (event.target.name === "surface") {
      let newArr = [...datas];
      newArr[index] = { ...newArr[index], surface: currentValue };
      if (datas[index].thickness && datas[index].surface) {
        newArr[index] = {
          ...newArr[index],
          volume: (newArr[index].thickness * currentValue) / 1000,
        };
      }
      setDatas(newArr);
    }
  };
  const removeItem = (index) => {
    let newItems = datas.filter((product, id) => id !== index);
    setDatas(newItems);
  };
  const addLine = () => {
    setDatas([
      ...datas,
      {
        thickness: 0,
        surface: 0,
        volume: 0,
      },
    ]);
  };
  return (
    <>
      {datas.map((data, index) => {
        return (
          <li key={index}>
            <input
              label="thickness mm"
              name="thickness"
              id={index}
              value={data.thickness}
              onChange={handleChange(index)}
            />

            <input
              name="surface"
              label="surface m¬2"
              id={index}
              value={data.surface}
              onChange={handleChange(index)}
            />
            <span>Volume {data.volume}</span>
            <button onClick={() => removeItem(index)}>X</button>
          </li>
        );
      })}

      <button onClick={addLine}>Add</button>
    </>
  );
};

export default App;
Источник

Ответы (1)

avatar
Soufiane Boutahlil
8 августа 2021 в 18:27
1

У вас проблема с вашими условиями, вы проверяете заполнены ли старые значения вместо проверки переменных newArr or currentValue.

Это пример: Если мы дадим thickness значение 100, когда пользователь начнет вводить input surface, вы проверите, заполнена ли переменная datas[index].surface (старое значение) вместо проверки текущего значения.

 const handleChange = (index) => (event) => {
    let currentValue = +event.target.value;
    if (event.target.name === "thickness") {
      let newArr = [...datas];
      newArr[index] = { ...newArr[index], thickness: currentValue };
      if (newArr[index].thickness && newArr[index].surface) { //you should verify the latest values not old
        newArr[index] = {
          ...newArr[index],
          volume: (currentValue * newArr[index].surface) / 1000
        };
      }
      setDatas(newArr);
    }
    if (event.target.name === "surface") {
      let newArr = [...datas];
      newArr[index] = { ...newArr[index], surface: currentValue };
      if (newArr[index].thickness && newArr[index].surface) { //you should verify the latest values not old
        newArr[index] = {
          ...newArr[index],
          volume: (newArr[index].thickness * currentValue) / 1000
        };
      }
      setDatas(newArr);
    }
  };

https://codesandbox.io/s/intelligent-liskov-dghgu?file=/src/App.js:99-939

andsemenov
8 августа 2021 в 20:00
0

Большое спасибо за решение.

Soufiane Boutahlil
9 августа 2021 в 09:09
0

Будет полезно, если вы сможете проверить ответ.