Мне нужно выбрать данные компонента в соответствии с предыдущим выбором

#javascript #reactjs #material-ui

Вопрос:

Я использую пользовательский интерфейс материала круче, чем моя задача на первом шаге, у меня есть флажок 2, и на шаге 2 также у меня есть два флажка, поэтому мне нужно установить условие в зависимости от выбора, означает, что если я выберу отдельного человека на первом шаге и перейду к, если я выберу Первый скрининг, то на шаге 3 мой один компонент покажет, например, текстовое поле показать, если я выберу массовый на шаге 1 и первый экран на шаге 2, то мой другой компонент покажет, например, поле загрузки файла, которое мне нужно установить, зависит от выбора или истинного условия в следующем значении на шаге 3 данные будут отображаться в любом шаге, означает, что на шаге 1 невозможно одновременно установить оба флажка, только один флажок будет установлен за один шаг вы также можете увидеть ссылку CodeSandbox

 
function getSteps() {
  return ["first", "second", "theird", "forth", "fivth"];
}

// Keep track of Selections in Step 1 and 2.
// We can use array as well with index as step keys.
const stepSelection = {
  individual: {
    value: false,
    text: "Individual"
  },
  bulk: {
    value: false,
    text: "Bulk"
  },
  firstScreening: {
    value: false,
    text: "First Screening"
  },
  secondScreening: {
    value: false,
    text: "Second Screening"
  }
};

// Handle on change even for checkbox.
const setStepsSelection = (e) => {
  stepSelection[e.target.name].value = e.target.checked;
};

function getStepContent(stepIndex) {
  switch (stepIndex) {
    case 0:
      return (
        <Box>
          <Box display="flex" alignItems="center">
            <Checkbox
              color="primary"
              inputProps={{ "aria-label": "secondary checkbox" }}
              onChange={setStepsSelection}
              name="individual"
            />
            <Typography variant="subtitle2" noWrap={true}>
              Individual
            </Typography>
          </Box>
          <Box display="flex" alignItems="center">
            <Checkbox
              color="primary"
              inputProps={{ "aria-label": "secondary checkbox" }}
              onChange={setStepsSelection}
              name="bulk"
            />
            <Typography variant="subtitle2" noWrap={true}>
              Bulk
            </Typography>
          </Box>
        </Box>
      );
    case 1:
      return (
        <Box>
          <Box display="flex" alignItems="center">
            <Checkbox
              color="primary"
              inputProps={{ "aria-label": "secondary checkbox" }}
              onChange={setStepsSelection}
              name="firstScreening"
            />
            <Typography variant="subtitle2" noWrap={true}>
              first Screening
            </Typography>
          </Box>
          <Box display="flex" alignItems="center">
            <Checkbox
              color="primary"
              inputProps={{ "aria-label": "secondary checkbox" }}
              onChange={setStepsSelection}
              name="secondScreening"
            />
            <Typography variant="subtitle2" noWrap={true}>
              second Screening
            </Typography>
          </Box>
        </Box>
      );
    case 2:
   // if "individual" - "firstScreening" and "secondScreening"depend on selection is true then show this

      return (
        <form noValidate autoComplete="off">
          <TextField id="standard-basic" label="Standard" />
          <TextField id="standard-basic" label="Standard" />
          
        </form>
      );

      // if "bulk" - "firstScreening" and "secondScreening" depend on selection is true then show this
      
      // return (
      //     <Paper elevation={3}>
      //     <Typography variant="subtitle2" noWrap={true}>
      //         Bulk Upload
      //       </Typography>
      //     </Paper>
      // );
    
        // this is i am trying previously
      // Map for previous checkboxes.
    // const selections = [
    //   "individual",
    //   "bulk",
    //   "firstScreening",
    //   "secondScreening"
    // ];

    // // Find the selected checkboxes in step 1 and 2.
    // let prevSelections = [];
    // selections.forEach((key) => {
    //   stepSelection[key].value amp;amp;
    //     prevSelections.push(stepSelection[key].text);
    // });

    // return prevSelections;
    case 3:
      return (
        <TextField
          id="outlined-select-currency"
          label="Target Date"
          variant="outlined"
          size="small"
          type="date"
          InputLabelProps={{
            shrink: true
          }}
          name="target_Date"
        ></TextField>
      );
    case 4:
      return (
       step 4
      );
    default:
      return "Unknown stepIndex";
  }
}

const Initiate = () => {
  const classes = useStyles();
  const [activeStep, setActiveStep] = React.useState(0);
  const steps = getSteps();

  const handleNext = () => {
    setActiveStep((prevActiveStep) => prevActiveStep   1);
  };

  const handleBack = () => {
    setActiveStep((prevActiveStep) => prevActiveStep - 1);
  };
  const handleStep = (step) => {
    setActiveStep((prevActiveStep) => {
      return step < prevActiveStep ? step : prevActiveStep;
    });
  };

  const handleReset = () => {
    setActiveStep(0);
  };

  return (
    <Grid container direction="column" justify="center">
      <Stepper activeStep={activeStep} alternativeLabel>
        {steps.map((label, index) => (
          <Step key={label}>
            <StepLabel onClick={() => handleStep(index)}>{label}</StepLabel>
          </Step>
        ))}
      </Stepper>
      <Box mt={3}></Box>
      <Grid item xs={12} sm={12} md={6}>
        {activeStep === steps.length ? (
          <Box>
            <Typography className={classes.instructions}>
              All steps completed
            </Typography>
            <Button onClick={handleReset}>Reset</Button>
          </Box>
        ) : (
          <Box>
            <Card>
              <CardContent>
                <Typography className={classes.instructions}>
                  {getStepContent(activeStep)}
                </Typography>
              </CardContent>
            </Card>
            <Box
              mt={2}
              display="flex"
              alignItems="center"
              justifyContent="flex-end"
            >
              <Button
                disabled={activeStep === 0}
                onClick={handleBack}
                className={classes.backButton}
              >
                Back
              </Button>
              <Button variant="contained" color="primary" onClick={handleNext}>
                {activeStep === steps.length - 1 ? "Finish" : "Next"}
              </Button>
            </Box>
          </Box>
        )}
      </Grid>
    </Grid>
  );
};
export default Initiate;

 

Ссылка на CodeSandbox

Комментарии:

1. Вам нужно использовать состояние для выбора шага. создайте переменную состояния для выбора шага и сохраните в ней весь объект. Затем на основе выбора вы можете условно манипулировать компонентом.

2. я знаю, что мне нужно использовать useState, но мне нужно установить состояние использования в функции инициализации, тогда как я могу изменить и отслеживать getStepContent, потому что я не могу получить доступ к onChange до этого