Показать следующие данные при переборе массива в машинописном тексте

Итак, я пытаюсь добавить некоторые данные в два разных массива в реагирующем машинописном тексте.

const [deviceNames, setDeviceNames] = useState<Array<string>>([])
  const [serialNumbers, setSerialNumbers] = useState<Array<string>>([])

Теперь я перебираю как массив здесь, так и отображаю содержимое

{deviceNames.length > 0 &&
      serialNumbers.length > 0 &&
      deviceNames.map(deviceName => {
        return serialNumbers.map(serialNumber => {
          return (
            <CardDevice
              deviceName={deviceName}
              serialNumber={serialNumber}
            />
          )
        })
      })}

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

 onSubmit = (values: any) => {
    clearError()
    setAddDevice(false)
    setDeviceNames(deviceName => [...deviceName, values.deviceName])
    setSerialNumbers(serialNumber => [...serialNumber, values.serialNumber])
  }

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

Спасибо


person Aditya Tiwari    schedule 28.02.2020    source источник


Ответы (3)


В общем, я ответил на свой вопрос:

import React, { useState } from "react";

function App() {
  const [addCardData, setAddCardData] = useState("");
  const [addCards, setAddCards] = useState<Array<string>>([]);

  const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {
    setAddCardData(event.target.value);
  };

  const handleSubmit = (event: React.FormEvent<HTMLFormElement>): void => {
    event.preventDefault();
    setAddCards(prevState => [...prevState, addCardData]);
  };
  return (
    <div
      className="App"
      style={{ textAlign: "center", margin: "0 auto", marginTop: "10em" }}
    >
      <form onSubmit={handleSubmit}>
        <input type="text" onChange={handleChange} placeholder="Add any text" />
        <button type="submit">Add</button>
      </form>
      {addCards.map(addCard => (
        <h3>{addCard}</h3>
      ))}
    </div>
  );
}

export default App;
person Aditya Tiwari    schedule 29.02.2020

Вот еще один динамический подход:

import React, { useState } from "react";
import { TextInput } from "./components/TextInput";

interface Device {
  deviceName: string;
  serialNumber: string | number;
}

const App: React.FC = () => {
  const [deviceName, setDeviceName] = useState("");
  const [serialNumber, setSerialNumber] = useState("");
  const [deviceInfos, setDeviceInfos] = useState<Device[]>([]);

  const handleDeviceChange = (event: React.ChangeEvent<HTMLInputElement>) => {
    setDeviceName(event.target.value);
  };
  const handleSerialChange = (event: React.ChangeEvent<HTMLInputElement>) => {
    setSerialNumber(event.target.value);
  };

  const handleSubmit = (event: React.FormEvent<HTMLFormElement>): void => {
    event.preventDefault();
    addDevice();
    setDeviceName("");
    setSerialNumber("");
  };

  const addDevice = () => {
    const newDevice: Device[] = [
      ...deviceInfos,
      { deviceName: deviceName, serialNumber: serialNumber }
    ];
    setDeviceInfos(newDevice);
  };
  return (
    <div
      className="App"
      style={{ textAlign: "center", margin: "0 auto", marginTop: "10em" }}
    >
      <form onSubmit={handleSubmit}>
        <TextInput
          type="text"
          placeholder="Add Device Name"
          handleChange={handleDeviceChange}
          value={deviceName}
        />
        <TextInput
          type="text"
          placeholder="Add fuck"
          handleChange={handleSerialChange}
          value={serialNumber}
        />
        <button type="submit">Add</button>
      </form>
      {deviceInfos.map((device, i) => (
        <div key={i}>
          <h3>{device.deviceName}</h3>
          <h3>{device.serialNumber}</h3>
        </div>
      ))}
    </div>
  );
};

export default App;
person Aditya Tiwari    schedule 29.02.2020

Намного лучший подход, который я использовал в производстве

  const ProfileDevices: React.FC<Props> = ({ onSubmit }) => {
      const [addDevice, setAddDevice] = useState(false)
      const [deviceInfos, setDeviceInfos] = useState<Device[]>([])

      const { register, handleSubmit, errors, clearError } = useForm({
        mode: 'onSubmit',
      })
      const addDevices: any = () => {
        setAddDevice(true)
      }

      onSubmit = (values: any) => {
        clearError()
        setAddDevice(false)
        const newDevice: Device[] = [
          ...deviceInfos,
          { deviceName: values.deviceName, serialNumber: values.serialNumber },
        ]
        setDeviceInfos(newDevice)
      }

      return (
        <ProfileContentContainer>
          <ProfileHeader>
            <ProfileTitle>Devices</ProfileTitle>

            <ProfileActions>
              <Button
                type="button"
                bgType="fill"
                size="default"
                label="Add Device"
                onClick={addDevices}
              />
            </ProfileActions>
          </ProfileHeader>
          {console.log(deviceInfos)}
          <DeviceList>
            <CardDevice deviceName="Device Name" serialNumber="QR10001123456788" />
            <CardDevice deviceName="Device Name" serialNumber="QR10001123456789" />
            {deviceInfos.map((device, i) => (
              <CardDevice
                key={i}
                deviceName={device.deviceName}
                serialNumber={device.serialNumber}
              />
            ))}
          </DeviceList>
          <Modal isActive={addDevice} toggleModal={() => setAddDevice(false)}>
            <ModalContent>
              <ModalHeader title="Add Device" />
              <AuthForm
                onSubmit={handleSubmit(onSubmit)}
                className="modalAddDeviceForm"
              >
                <InputText
                  placeholder="DeviceName"
                  name="deviceName"
                  type="text"
                  register={register({ required: true, maxLength: 10 })}
                  hasError={errors.deviceName}
                  errorMessage={
                    errors.serialNumber ? errors.serialNumber.message : undefined
                  }
                />
                <InputText
                  placeholder="Serial Number"
                  name="serialNumber"
                  type="text"
                  register={register({ required: true, maxLength: 10 })}
                  hasError={errors.serialNumber}
                  errorMessage={
                    errors.serialNumber ? errors.serialNumber.message : undefined
                  }
                />
                <Button type="submit" bgType="fill" size="default" label="Add" />
              </AuthForm>
              <ModalActions></ModalActions>
            </ModalContent>
          </Modal>
        </ProfileContentContainer>
      )
    }

    export default ProfileDevices
person Aditya Tiwari    schedule 04.03.2020