Как мне отключить распространение аккордеона после того, как он был нажат в первый раз?

#javascript #reactjs #material-ui

#javascript #reactjs #материал-пользовательский интерфейс

Вопрос:

У меня есть Accordion с a TextField в AccordionSummary (Материал-пользовательский интерфейс), который при нажатии открывает AccordionDetails с остальной частью формы, однако я не могу понять, как остановить запуск распространения несколькими щелчками по полю, чтобы открывать и закрывать содержимое аккордеона после первого щелчка. Я не хочу, чтобы новое видимое содержимое формы исчезало после первого щелчка AccountSummary . Я знаю, как отключить распространение при первом вводе поля, но не как разрешить распространение только один раз?

 import React from "react";
import { Formik, Field, Form } from "formik";
import { TextField, Select } from "formik-material-ui";
import Grid from "@material-ui/core/Grid";
import Box from "@material-ui/core/Box";
import FormControl from "@material-ui/core/FormControl";
import MenuItem from "@material-ui/core/MenuItem";
import Button from "@material-ui/core/Button";
import Accordion from "@material-ui/core/Accordion";
import MuiAccordionDetails from "@material-ui/core/AccordionDetails";
import MuiAccordionSummary from "@material-ui/core/AccordionSummary";
import { withStyles } from "@material-ui/core/styles";

const AccordionSummary = withStyles({
  root: {
    "amp;.Mui-focused": {
      backgroundColor: "inherit"
    }
  }
})(MuiAccordionSummary);

const AccordionDetails = withStyles({
  root: {
    paddingTop: 0
  }
})(MuiAccordionDetails);

export default function App() {
  return (
    <div className="App">
      <Formik>
        <Form>
          <Accordion>
            <AccordionSummary>
              <FormControl fullWidth>
                <Field
                  component={TextField}
                  name="itemName"
                  placeholder="What do you want to buy?"
                  variant="outlined"
                />
              </FormControl>
            </AccordionSummary>
            <AccordionDetails>
              <Grid container>
                <Grid item xs={2}>
                  <Box>
                    <FormControl fullWidth>
                      <Field
                        component={TextField}
                        name="quantity"
                        label="Qty"
                        type="number"
                        variant="outlined"
                        size="small"
                      />
                    </FormControl>
                  </Box>
                </Grid>
                <Grid item xs={2}>
                  <Box pl={1}>
                    <FormControl fullWidth>
                      <Field
                        component={TextField}
                        name="volume"
                        label="Vol"
                        type="number"
                        variant="outlined"
                        size="small"
                      />
                    </FormControl>
                  </Box>
                </Grid>
                <Grid item xs={2}>
                  <Box pl={1}>
                    <FormControl label="Type" size="small" fullWidth>
                      <Field
                        component={Select}
                        name="volumeType"
                        as="select"
                        variant="outlined"
                      >
                        <MenuItem value="g">grams</MenuItem>
                        <MenuItem value="kg">kg</MenuItem>
                        <MenuItem value="ml">ml</MenuItem>
                        <MenuItem value="cl">cl</MenuItem>
                        <MenuItem value="litre">litre</MenuItem>
                        <MenuItem value="pint">pint</MenuItem>
                        <MenuItem value="pack">pack</MenuItem>
                      </Field>
                    </FormControl>
                  </Box>
                </Grid>
                <Grid item xs={4}>
                  <Box pl={1}>
                    <FormControl fullWidth>
                      <Field
                        component={TextField}
                        name="brandName"
                        label="Brand"
                        variant="outlined"
                        size="small"
                      />
                    </FormControl>
                  </Box>
                </Grid>
                <Grid item xs={2}>
                  <Box pl={1}>
                    <Button
                      type="submit"
                      variant="contained"
                      color="primary"
                      disableElevation
                      fullWidth
                    >
                      Add
                    </Button>
                  </Box>
                </Grid>
              </Grid>
            </AccordionDetails>
          </Accordion>
        </Form>
      </Formik>
    </div>
  );
}
  

Редактировать gifted-maxwell-gp7kr

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

1. Я попробую разобраться с этим для вас

Ответ №1:

Единственный способ, которым я мог заставить это работать, не создавая значительного снижения производительности, заключался в следующем:

 import Accordion from "@material-ui/core/Accordion";
import AccordionDetails from "@material-ui/core/AccordionDetails";
import AccordionSummary from "@material-ui/core/AccordionSummary";
import Typography from "@material-ui/core/Typography";
import ExpandMoreIcon from "@material-ui/icons/ExpandMore";
import React, { useState } from "react";

export default function ControlledAccordions() {
  const [expanded, setExpanded] = useState("");
  const handleChange = (panel) => () => {
    setExpanded(panel);
  };

  return (
    <div>
      <Accordion
        expanded={expanded === "panel1"}
        onChange={handleChange("panel1")}
      >
        <AccordionSummary expandIcon={<ExpandMoreIcon />}>
          <Typography>General settings</Typography>
          <Typography>I am an accordion</Typography>
        </AccordionSummary>
        <AccordionDetails>
          <Typography>
            Nulla facilisi. Phasellus sollicitudin nulla et quam mattis feugiat.
            Aliquam eget maximus est, id dignissim quam.
          </Typography>
        </AccordionDetails>
      </Accordion>
    </div>
  );
}

  

Редактировать управляемый аккордеон

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

1. Большое спасибо, что взглянули на это для меня. Я добавил ваш код в изолированную среду, но он говорит, что не может найти переменную ‘string’. Кажется, я не могу исправить раздел кода, поскольку я не совсем понимаю синтаксис там? codesandbox.io/s/gifted-dream-kv9x4?file=/src/App.js

2. @Anthony : string После panel и <string> после useState являются синтаксисом машинописного текста. Я обновил ответ @AlexMckay, чтобы добавить изолированную среду и удалить машинопись.

3. А, понятно! Блестяще. Спасибо вам обоим за это!