Donc, j'essaie d'ajouter des données à deux tableaux différents dans react typescript
onSubmit = (values: any) => { clearError() setAddDevice(false) setDeviceNames(deviceName => [...deviceName, values.deviceName]) setSerialNumbers(serialNumber => [...serialNumber, values.serialNumber]) }
Je suis maintenant en train de faire une boucle sur le tableau ici et d'afficher le contenu
{deviceNames.length > 0 && serialNumbers.length > 0 && deviceNames.map(deviceName => { return serialNumbers.map(serialNumber => { return ( <CardDevice deviceName={deviceName} serialNumber={serialNumber} /> ) }) })}
J'ajoute des données à ces tableaux en cliquant sur un bouton, puis en affichant modal, puis comme ceci
const [deviceNames, setDeviceNames] = useState<Array<string>>([]) const [serialNumbers, setSerialNumbers] = useState<Array<string>>([])
J'utilise le formulaire de hook de réaction. Donc, ce que je veux, c'est que chaque fois que je boucle sur les deux tableaux, chaque fois qu'il doit afficher le contenu qui vient d'être ajouté dans le tableau, le nouveau n'est pas le dernier qui a déjà été ajouté et affiché. J'espère pouvoir faire valoir un point ici. Il fait le travail, mais chaque fois que l'utilisateur entre un nouveau périphérique après en avoir ajouté un, il ajoute à nouveau l'ancien, puis le nouveau, puis encore et encore la même chose. je veux juste afficher un seul nouvel élément qui vient d'être ajouté à un tableau par l'utilisateur.
Merci
3 Réponses :
En gros, j'ai répondu à ma propre question:
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;
Voici une autre approche dynamique:
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;
Une bien meilleure approche que j'ai utilisée dans la production
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