表单中的自动完成材料 ui

问题描述

import React,{ FunctionComponent,useEffect } from "react";
import TextField from "@material-ui/core/TextField";
import Autocomplete from "@material-ui/lab/Autocomplete";
import CircularProgress from "@material-ui/core/CircularProgress";

interface AsyncProps {
  data: any;
  id: string;
  value: any;
  onChange: ((event: React.ChangeEvent<{}>,value: any,reason: AutocompleteChangeReason,details?: AutocompleteChangeDetails<any> | undefined) => void) | undefined
}

interface DataType {
  name: string;
  _id: string;
}

const Asynchronous: FunctionComponent<AsyncProps> = ({ data,id,value }) => {
  const [open,setopen] = React.useState(false);
  const [options,setoptions] = React.useState<DataType[]>([]);

  useEffect(() => {
    setoptions(data);
    if (!open) {
      setoptions([]);
    }
  },[open]);
  const loading = open && data.length === 0;
  return (
    <Autocomplete
      id={id}
      style={{ width: 300 }}
      open={open}
      onChange = {}
      value={value}
      onopen={() => {
        setopen(true);
      }}
      onClose={() => {
        setopen(false);
      }}
      getoptionSelected={(option,value) => {
        return option._id === value._id;
      }}
      getoptionLabel={(option) => {
        return option.name;
      }}
      options={options}
      loading={loading}
      renderInput={(params) => (
        <TextField
          {...params}
          label="Asynchronous"
          variant="outlined"
          InputProps={{
            ...params.InputProps,endAdornment: (
              <React.Fragment>
                {loading ? (
                  <CircularProgress color="inherit" size={20} />
                ) : null}
                {params.InputProps.endAdornment}
              </React.Fragment>
            ),}}
        />
      )}
    />
  );
};

export default Asynchronous;

  import React,useEffect,useState } from "react";
import {
  Grid,TextField,makeStyles,FormControl,InputLabel,Theme,createStyles,Button,} from "@material-ui/core";
import {
  getTickets,deleteTicket,updateTicket,createTicket,getSingleTicket,} from "../services/ticketDetails";
import { MainTable,TableMouseEventHandler } from "./Table/Table";
import { ITicketDetail } from "../models/ticketDetail";
import DropDown from "./DropDown";
import { getStatus } from "../services/status";
import { IStatus } from "../models/status";
import { getClients } from "../services/client";
import { IPriority } from "../models/priority";
import { getPriority } from "../services/priority";
import FormDialog from "./FormDialog";
import AsynChronous from "./AutoComplete";

const useStyles = makeStyles((theme: Theme) =>
  createStyles({
    formControl: {
      margin: theme.spacing(2),minWidth: 500,},button: {
      margin: "8px",})
);

const TicketDetails: FunctionComponent = () => {
  const [tickets,SetTickets] = useState<ITicketDetail[]>([]);

  const [formData,setFormData] = useState({
    client: "",problemDomain: "",subject: "",message: "",priority: "",status: "",remarks: "",});

  const classes = useStyles();

  const [id,setId] = useState("");
  const [edit,setEdit] = useState(false);
  const [status,setStatus] = useState<IStatus[]>([]);
  const [clients,setClients] = useState([]);
  const [priority,setPriority] = useState<IPriority[]>([]);

  const [open,setopen] = useState(false);

  useEffect(() => {
    fetchTickets();
    fetchStatus();
    fetchClients();
    fetchPriority();
  },[]);

  const fetchTickets = async () => {
    const tickets = await getTickets();
    SetTickets(tickets);
  };

  const fetchStatus = async () => {
    const data = await getStatus();
    setStatus(data);
  };

  const fetchClients = async () => {
    const data = await getClients();
    setClients(data);
  };

  const fetchPriority = async () => {
    const data = await getPriority();
    setPriority(data);
  };

  const clear = () => {
    setFormData({
      client: "",});
  };

  const handleSubmit:
    | React.MouseEventHandler<HTMLButtonElement>
    | undefined = async (e) => {
    e.preventDefault();

    try {
      if (edit) {
        await updateTicket(id,{ ...formData });
        setEdit(false);
      } else {
        await createTicket(formData);
      }
      setopen(!open);
      return clear();
    } catch (e) {
      return e;
    }
  };

  const handleEdit: TableMouseEventHandler = async (id) => {
    setId(id);
    setEdit(true);
    const data = await getSingleTicket(id);
    setopen(!open);
    setFormData({ ...data });
  };

  const handleDelete: TableMouseEventHandler = async (id) => {
    await deleteTicket(id);
  };

  const onChange = (
    event: React.ChangeEvent<{ name?: string; value: unkNown }>
  ) => {
    const name = event.target.name as keyof typeof formData;
    setFormData({
      ...formData,[name]: event.target.value,});
  };

  return (
    <>
      <Grid>
        <FormDialog
          edit={edit}
          handleSubmit={handleSubmit}
          open={open}
          setopen={setopen}
          setEdit={setEdit}
          title="TicketDetails Form"
        >
          <form autoComplete="off">
            <FormControl className={classes.formControl}>
              <InputLabel htmlFor="client">Client</InputLabel>
              {/* <DropDown
                value={formData.client}
                data={clients}
                onchange={onChange}
                id="client"
                name="client"
              /> */}
              <AsynChronous
                data={clients}
                id="client"
                value={formData.client}
              />
            </FormControl>

            <FormControl className={classes.formControl}>
              <InputLabel htmlFor="status">Status</InputLabel>
              {/* <DropDown
                value={formData.status}
                data={status}
                onchange={onChange}
                id="status"
                name="status"
              /> */}
              {/* <AsynChronous data={status} id="status" /> */}
            </FormControl>

            <FormControl className={classes.formControl}>
              <InputLabel htmlFor="priority">Priority</InputLabel>
              {/* <DropDown
                value={formData.priority}
                data={priority}
                onchange={onChange}
                id="priority"
                name="priority"
              /> */}
              <AsynChronous
                data={priority}
                id="priority"
                value={formData.priority}
              />
            </FormControl>

            <FormControl className={classes.formControl}>
              <TextField
                label="Problem Domain"
                name="problemDomain"
                value={formData.problemDomain}
                onChange={onChange}
              />
            </FormControl>

            <FormControl className={classes.formControl}>
              <TextField
                label="Subject"
                name="subject"
                value={formData.subject}
                onChange={onChange}
              />
            </FormControl>

            <FormControl className={classes.formControl}>
              <TextField
                label="Message"
                name="message"
                value={formData.message}
                onChange={onChange}
              />
            </FormControl>

            <FormControl className={classes.formControl}>
              <TextField
                label="Remarks"
                name="remarks"
                value={formData.remarks}
                onChange={onChange}
              />
            </FormControl>
          </form>

          {/* <TicketDetailsForm
            edit={edit}
            setEdit={setEdit}
            open={open}
            setopen={setopen}
            id={id}
          /> */}
        </FormDialog>

        <Button
          variant="contained"
          color="primary"
          onClick={() => setopen(true)}
          className={classes.button}
        >
          Add Item
        </Button>

        {tickets.length === 0 ? (
          ""
        ) : (
          <MainTable
            tableHeaders={tickets}
            handleDelete={handleDelete}
            handleEdit={handleEdit}
          />
        )}
      </Grid>
    </>
  );
};

export default TicketDetails;

我正在尝试创建一个可重复使用的材料 ui 自动完成组件以在表单中使用它。但是我无法在自动完成组件中使用 onchange 处理程序。我无法在 formdata 状态中映射自动完成组件的值。 formdata 中的客户端有一个由 mongodb 生成的 id 值,在发布表单数据时,我想使用客户端的 id 作为值。但是在自动完成中选择值时,我想将其用作名称

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)