Мне нужно вычесть счетчик и обновить оставшийся счет

Я использую TextField, данные поля, которые я добавляю в таблицу, которая отлично работает, в чем заключается моя задача. У меня есть одно поле с именем Общее количество, и я храню свой счетчик данных, поэтому всякий раз, когда я добавляю данные в таблицу, он будет основан на счете, что означает например, если у меня есть счет 3, то я могу использовать счетчик максимум 3 или если я хочу разделить этот счет с другим именем, которое также работает только с максимальным счетчиком, я использовал все, что присутствует в Общее количество или после деления счетчика на имя пользователя, которое мне нужно обновить оставшееся количество в этом поле или любое другое количество, которое присутствует после добавления в таблицу, показывающую оставшееся количество, когда я использую все количество за один раз или добавляю его в таблицу, которая работает нормально, означает, что Общее количество вычитается из счетчика данных таблицы и остается 0, но когда Я делю это количество на 2 или 3 поля имен, что означает 1 на 1, тогда оно не будет работать должным образом, значит, количество не вычитается должным образом.

В этом методе я вычитаю и устанавливаю оставшееся количество

  const totalRemainingCount =
    totalUsers -
    Number(
      AssignSearchesForm.values.countAssigned ||
        teamdata?.map((data) => data.countAssigned)
    );
export default function App() {
  const [teamdata, setTeamData] = React.useState([]);

  const AssignSearchesForm = useFormik({
    initialValues: {
      selectName: "",
      selectAge: "",
      location: "",
      countAssigned: ""
    },
    validationSchema,
    onSubmit: (values, formikHelper) => {
      setTeamData([values, ...teamdata]);
      formikHelper.resetForm();
    }
  });

  let filteredArray = nameList.filter(
    (e) => !teamdata.some((data) => data.selectName === e.selectName)
  );

  const handleChangeEvent = (e) => {
    const selectedName = e.target.value;
    const name = nameList.find((data) => data.selectName === selectedName);
    const newOptions = Object.values(name).reduce((optionList, key) => {
      optionList.push({ value: key, label: key });
      return optionList;
    }, []);
    AssignSearchesForm.setFieldValue("selectName", selectedName);
    AssignSearchesForm.setFieldValue("selectAge", newOptions[1]?.value || "");
    AssignSearchesForm.setFieldValue("location", newOptions[2]?.value || "");
  };

  const totalUsers = 3;
  const totalRemainingCount =
    totalUsers -
    Number(
      AssignSearchesForm.values.countAssigned ||
        teamdata?.map((data) => data.countAssigned)
    );

  return (
    <div className = "App">
      <Card color = "primary" variant = "outlined">
        <CardHeader
          title = {
            <Typography variant = "subtitle1">
              Total no of count  = {" "}
              {totalRemainingCount <= 0 ? 0 : totalRemainingCount}
            </Typography>
          }
        />
        <Divider />
        <CardContent>
          <Grid container direction = "row" spacing = {1}>
            <Grid item xs = {4}>
              <TextField
                sx = {{ minWidth: 185 }}
                select
                id = "outlined-basic"
                label = "Select Name"
                name = "selectName"
                size = "small"
                onChange = {handleChangeEvent}
                value = {AssignSearchesForm.values.selectName}
                error = {
                  AssignSearchesForm.errors.selectName &&
                  AssignSearchesForm.touched.selectName
                }
                helperText = {
                  AssignSearchesForm.touched.selectName &&
                  AssignSearchesForm.errors.selectName
                }
              >
                {filteredArray?.map((option) => (
                  <MenuItem key = {option.selectName} value = {option.selectName}>
                    {option.selectName}
                  </MenuItem>
                ))}
              </TextField>
            </Grid>
            <Grid item xs = {4}>
              <TextField
                id = "outlined-basic"
                label = "location"
                name = "location"
                size = "small"
                {...AssignSearchesForm.getFieldProps("location")}
                error = {
                  AssignSearchesForm.touched.location &&
                  AssignSearchesForm.errors.location
                }
                helperText = {
                  AssignSearchesForm.touched.location &&
                  AssignSearchesForm.errors.location
                }
              />
            </Grid>
            <Grid item xs = {4}>
              <TextField
                id = "outlined-basic"
                label = "Select Age"
                name = "selectAge"
                size = "small"
                {...AssignSearchesForm.getFieldProps("selectAge")}
                error = {
                  AssignSearchesForm.errors.selectAge &&
                  AssignSearchesForm.touched.selectAge
                }
                helperText = {
                  AssignSearchesForm.touched.selectAge &&
                  AssignSearchesForm.errors.selectAge
                }
              />
            </Grid>
            <Grid item xs = {4}>
              <TextField
                id = "outlined-basic"
                label = "Count Assign"
                name = "countAssigned"
                size = "small"
                type = "number"
                {...AssignSearchesForm.getFieldProps("countAssigned")}
                error = {
                  AssignSearchesForm.errors.countAssigned &&
                  AssignSearchesForm.touched.countAssigned
                }
                helperText = {
                  AssignSearchesForm.touched.countAssigned &&
                  AssignSearchesForm.errors.countAssigned
                }
              />
            </Grid>
            <Grid item xs = {4}>
              <Button
                onClick = {() => {
                  AssignSearchesForm.handleSubmit();
                }}
                variant = "contained"
              >
                Add
              </Button>
            </Grid>
          </Grid>
        </CardContent>
      </Card>
      <Table teamdata = {teamdata} />
    </div>
  );
}

Ссылка на CodeSandBox

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
45
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Что я понял до сих пор, так это то, что Total count не настроен должным образом. Если это так, вам нужно установить состояние счетчика, когда вы нажимаете кнопку add, чтобы он сохранял значение countAssigned. Также используйте свойство max в TextField, чтобы ограничить количество оставшимся значением.

Я отредактировал ваши коды и ящик пример.

вы правильно понимаете, но свойство max в TextField ограничивает количество оставшимся значением. это, я думаю, бесполезно, потому что нам нужно проверить подсчет, что означает, что пользователь может использовать только это Total count, поэтому после этого подсчета становится нулем, поэтому в текстовом поле, если пользователь пытается или добавляет число и нажимает кнопку ДОБАВИТЬ, нужно выбросить ошибка, поэтому, используя max в текстовом поле, я не уверен, что это правильно

dev developer 13.05.2022 08:03

вы можете удалить, если хотите, но вместо того, чтобы выдавать ошибку после того, как пользователь нажмет «Добавить», почему бы не предотвратить это, используя max или просто отключите кнопку add?

Usama 13.05.2022 08:14

но с использованием свойства max оно не будет работать для всех случаев, это означает, что оно работает только в том случае, если я использую символ меньше и больше, либо если я редактирую в этом случае, max не будет работать для справки, вы можете проверить ссылку на песочницу кода, я добавил свойство max

dev developer 13.05.2022 13:00
Ответ принят как подходящий

Вам нужно обновить свою логику для того, как вы вычисляете количество:

const totalRemainingCount =
    totalUsers -
    (parseInt(
      AssignSearchesForm.values.countAssigned
        ? AssignSearchesForm.values.countAssigned
        : 0,
      10
    ) + teamdata?.reduce((partialSum, a) => partialSum + a.countAssigned, 0));

Вы получали NaN, потому что данные, которые вы пытались использовать для вычитания, не были числом. Здесь я вычисляю сумму countAssigned в таблице и добавляю ее к данным формы, что позволит вам получить правильное значение.

Вот пример:https://codesandbox.io/s/preset-ranges-antd-4-19-2-forked-kczd1y?file=/App.js:1838-2095

Другие вопросы по теме