Скрыть и показать раскрывающийся список при установке / снятии флажка

У меня проблема, мне нужно показать и скрыть поле DropDown/Selects в зависимости от состояния флажка. Означает, что когда состояние флажка отмечено, мне нужно показать раскрывающийся список, а когда я снимаю флажок, он должен скрываться. Я прикрепил код этого компонента ниже. Как видите, у меня уже создано 3 выпадающих списка, но мне нужно скрыть/показать их, установив/сняв один флажок.

import React, { useState, useEffect } from "react";
import { Button } from "../../components/Button";
import { Checkbox } from "../../components/Checkbox";
import { FormBuilder } from "../../components/FormBuilder";
import { Grid, GridCell, GridRow } from "../../components/Grid";
import { LinearProgress } from "../../components/LinearProgress";
import { Select } from "../../components/Select";
import { TextField } from "../../components/TextField";
import { Name } from "../../models/Name";
import { Option } from "../../models/Option";
import { DynamicForm } from "../../models/DynamicForm";
import "./index.css";
import { Organization } from "../../models/Organization";
import { request } from "../../api";
import { serialize } from "class-transformer";
import { CodingTemplate } from "../../models/CodingTemplate";
import { useHistory } from "react-router-dom";
import { useRef } from "react";

const NUMBER_OF_STEPS = 3;
const screen = {
  first: 1,
  second: 2,
  third: 3,
};

const FormDetails = ({ dynamicForm }: { dynamicForm: DynamicForm }) => {
  const check1 = useRef();

  return (
    <div>
      <h4 style = {{ margin: 16 }}>Данные формы</h4>
      <Grid>
        
        <GridRow>
          <GridCell span = {5}>
            <Checkbox
              label = "CHECKBOX"
              onChange = {(value) => (dynamicForm.needExtraApprove = value)}
              defaultChecked = {dynamicForm.needExtraApprove}
            />
          </GridCell>
        </GridRow>
        <GridRow>
          <GridCell span = {4}>             
              <Select<Option>
                required
                //defaultValue = {dynamicForm.departmentHash}
                label = "Select to show/hide"
                type = {Option}
                //api = "/state_schedule/departments-with-journals/"
                defaultOptions = {defaultOptions}
                //onChange = {(value: Option) => dynamicForm.departmentHash = value}
              />
            }
          </GridCell>
          <GridCell span = {4}>
            <Select<Option>
              required
              //defaultValue = {dynamicForm.departmentHash}
              label = "Select to show/hide"
              type = {Option}
              //api = "/state_schedule/departments-with-journals/"
              defaultOptions = {defaultOptions}
              //onChange = {(value: Option) => dynamicForm.departmentHash = value}
            />
          </GridCell>
          <GridCell span = {4}>
            <Select<Option>
              required
              //defaultValue = {dynamicForm.departmentHash}
              label = "Select to show/hide"
              type = {Option}
              //api = "/state_schedule/departments-with-journals/"
              defaultOptions = {defaultOptions}
              //onChange = {(value: Option) => dynamicForm.departmentHash = value}
            />
          </GridCell>
        </GridRow>
      </Grid>
    </div>
  );
};

const FormFields = ({ dynamicForm }: { dynamicForm: DynamicForm }) => (
  <div>
    <h4 style = {{ margin: 16 }}>ASD</h4>
    <FormBuilder dynamicForm = {dynamicForm} />
  </div>
);

export default () => {
  const [step, setStep] = useState(1);
  const [dynamicForm, setDynamicForm] = useState<DynamicForm>(
    new DynamicForm()
  );
  let progress = parseFloat(((step - 1) * (1 / NUMBER_OF_STEPS)).toFixed(2));
  const onBackButtonPress = () => {
    if (step > 0) {
      setStep((prev) => prev - 1);
    }
  };

  const onNextButtonPress = () => {
    event.preventDefault();

    if (step < screen.third) {
      setStep((prev) => prev + 1);
    } else {
      console.info("submit!");
      //submit
    }
    // if (step < screen.third) {
    //   setStep((prev) => prev + 1);
    // } else {
    //   console.info("submit!");
    //   //submit
    // }
  };

  const history = useHistory();
  const onSubmitTest = async (event: React.FormEvent<HTMLFormElement>) => {
    event.preventDefault();

    try {
      console.info(dynamicForm);
      await request("/service-desk/forms/", {
        method: "POST",
        body: serialize(dynamicForm),
      });

      history.push({
        pathname: "/service-desk/application-form",
      });
    } catch (error) {
      console.info(error);
      alert("ERROR");
    }
  };

  let content = <SubDivision dynamicForm = {dynamicForm} />;
  let nextBtnLabel = "NEXT";
  if (step === screen.second) {
    content = <FormDetails dynamicForm = {dynamicForm} />;
  } else if (step === screen.third) {
    content = <FormFields dynamicForm = {dynamicForm} />;
  }

  return (
    <form onSubmit = {onSubmitTest} noValidate = {step === screen.third}>
      <LinearProgress progress = {progress} determinate />
      {content}
      <div className = "request-btn-container">
        <Button
          label = "BACK"
          disabled = {step == 1}
          onClick = {onBackButtonPress}
        />
        {step === 3 ? (
          <Button label = "SAVE" raised type = "submit" />
        ) : (
          <Button
            label = "NEXT"
            disabled = {step == 3}
            onClick = {onNextButtonPress}
          />
        )}
      </div>
    </form>
  );
};

. Спасибо за любую подсказку или совет!

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
0
621
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Позвольте мне знать, если это помогает.

const FormDetails = ({ dynamicForm }: { dynamicForm: DynamicForm }) => {
  const check1 = useRef();

  return (
    <div>
      <h4 style = {{ margin: 16 }}>Данные формы</h4>
      <Grid>
        
        <GridRow>
          <GridCell span = {5}>
            <Checkbox
              label = "CHECKBOX"
              onChange = {(value) => (dynamicForm.needExtraApprove = value)}
              defaultChecked = {dynamicForm.needExtraApprove}
            />
          </GridCell>
        </GridRow>
        {dynamicForm.needExtraApprove ? (
            <GridRow>
              <GridCell span = {4}>             
                  // put your select here
              </GridCell>
              <GridCell span = {4}>
               // put your select here
              </GridCell>
              <GridCell span = {4}>
                // put your select here
              </GridCell>
          </GridRow>
        ): null}
        
      </Grid>
    </div>
  );
};

Скрыть / показать раскрывающийся список в зависимости от проверенного состояния.

Bipin Shrestha 22.12.2020 07:00

да .. на основе dynamicForm.needExtraApprove значения. это то, что вы ищете?

Nilesh Patel 22.12.2020 07:01

о, это не сработало для меня. Это дает мне много ошибок, когда я добавляю `{dynamicForm.needExtraApprove? (...):нулевой}

GGotchaA 22.12.2020 07:23

код обновлен. была дополнительная } попробуйте сейчас

Nilesh Patel 22.12.2020 07:27

эй, это не сработает .. все же я вижу ошибку в коде, который вы разместили.

Nilesh Patel 22.12.2020 07:29

код обновлен.. Я поставил заполнитель для всех 3 вариантов.. поместите его туда, и он должен работать.

Nilesh Patel 22.12.2020 07:30

да, я понял, большое спасибо. Сейчас заработало без ошибок. Но теперь он скрывает мои «Выборы» и не работает с флажком. Означает, что когда я нажимаю на свой флажок, он ничего не делает. Я думаю, нам нужно добавить некоторые условия для флажка, верно? Что-то вроде if value != checkbox checked etc

GGotchaA 22.12.2020 07:48
onChange = {(value) => (dynamicForm.needExtraApprove = value)} пытаюсь обновить реквизит. Вам нужно использовать реквизит как обратный вызов и передать его родительскому компоненту, а родительский компонент должен обновиться dynamicForm.needExtraApprove
Nilesh Patel 22.12.2020 07:52

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