У меня проблема, мне нужно показать и скрыть поле 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>
);
};
. Спасибо за любую подсказку или совет!
Позвольте мне знать, если это помогает.
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>
);
};
да .. на основе dynamicForm.needExtraApprove
значения. это то, что вы ищете?
о, это не сработало для меня. Это дает мне много ошибок, когда я добавляю `{dynamicForm.needExtraApprove? (...):нулевой}
код обновлен. была дополнительная }
попробуйте сейчас
эй, это не сработает .. все же я вижу ошибку в коде, который вы разместили.
код обновлен.. Я поставил заполнитель для всех 3 вариантов.. поместите его туда, и он должен работать.
да, я понял, большое спасибо. Сейчас заработало без ошибок. Но теперь он скрывает мои «Выборы» и не работает с флажком. Означает, что когда я нажимаю на свой флажок, он ничего не делает. Я думаю, нам нужно добавить некоторые условия для флажка, верно? Что-то вроде if value != checkbox checked etc
onChange = {(value) => (dynamicForm.needExtraApprove = value)}
пытаюсь обновить реквизит. Вам нужно использовать реквизит как обратный вызов и передать его родительскому компоненту, а родительский компонент должен обновиться dynamicForm.needExtraApprove
Скрыть / показать раскрывающийся список в зависимости от проверенного состояния.