Как скрыть форму после отправки в react, в настоящее время вам нужно нажать кнопку переключения

#javascript #reactjs #forms #express #hide

#язык JavaScript #реагирует на #формы #экспресс #скрыть

Вопрос:

В настоящее время я визуализирую список песен, в котором есть кнопка переключения, которую я сделал, чтобы отобразить форму для добавления песни. Как я могу сделать так, чтобы при отправке этой формы она скрывала форму без нажатия кнопки. Я попытался создать эффект использования для запуска функции, но не смог ее взломать. Заранее спасибо.

Список песен

 import { useEffect, useState } from 'react'; import { useDispatch, useSelector } from 'react-redux';  import { deleteSong, getSongs, updateSong } from '../../store/song';  import ReactAudioPlayer from 'react-audio-player'; import { useHistory } from 'react-router'; import SongForm from '../AddSongForm'; import EditSongForm from '../EditSongForm'; import SpecificSong from '../SpecificSong';  const SongList = () =gt; {   const [addShowForm, setAddShowForm] = useState(false);  // const [editShowForm, setEditShowForm] = useState(false);   const history = useHistory()  const dispatch = useDispatch();   const songsObj = useSelector((state) =gt; state.songState.entries);  const songs = Object.values(songsObj)   const user = useSelector((state) =gt; state.session.user);  const CurrentUserId = user?.id   const remove = (e) =gt; {  dispatch(deleteSong(e.target.id));  }    const addFormCheck = (e) =gt; {  if (addShowForm) setAddShowForm(false)  if (!addShowForm) setAddShowForm(true)  }  // const editFormCheck = (e) =gt; {  // if (editShowForm) setEditShowForm(false)  // if (!editShowForm) setEditShowForm(true)  // }   useEffect(() =gt; {  dispatch(getSongs());  }, [dispatch]);    return (  lt;divgt;  lt;divgt;  lt;button onClick={addFormCheck}gt;add a songlt;/buttongt;  {addShowForm ?  lt;SongForm /gt;  : null}  lt;/divgt;  lt;h1gt;Song Listlt;/h1gt;  lt;olgt;  {songs.map(({ id, songName, songLink, userId }) =gt; (  lt;divgt;  lt;SpecificSong id={id} songName={songName} songLink={songLink} userId={userId} /gt;  lt;/divgt;  ))}  lt;/olgt;  lt;/divgt;  ); }; export default SongList;  

И компонент, который визуализируется

 import { useState } from "react"; import { useDispatch } from "react-redux";  import { postSong } from "../../store/song";  import { useSelector } from "react-redux";    import Axios from 'axios'  const SongForm = () =gt; {  const dispatch = useDispatch();   const [songName, setSongName] = useState("");  const [songLink, setSongLink] = useState("");  const [errors, setErrors] = useState([]);   const [songSelected, setSongSelected] = useState("")   const reset = () =gt; {  setSongName("");  setSongLink("");   };  const user = useSelector((state) =gt; state.session.user);  const userId = user?.id   let url;   const handleSubmit = async (e) =gt; {  e.preventDefault();   const formData = new FormData()  formData.append('file', songSelected)  formData.append('upload_preset', 'd3gthd7l')   if (songSelected === '') {  setErrors(['You have to upload an audio file!'])  }   Axios.post("https://api.cloudinary.com/v1_1/dyhfkvy6u/video/upload", formData).then(async (response) =gt; {  if (response.data.url) url = response.data.url  const newSong = {  songName,  songLink: url,  userId  };  const song = await dispatch(postSong(newSong))  .catch(async (res) =gt; {  const data = await res.json()  if (data amp;amp; data.errors) setErrors(data.errors)  })    })   // reset();  };    return (  lt;div className="inputBox"gt;  lt;h1gt;Add A Songlt;/h1gt;  lt;ulgt;  {errors.map((error, idx) =gt; lt;li className='errors' key={idx}gt;{error}lt;/ligt;)}  lt;/ulgt;  lt;form onSubmit={handleSubmit}gt;  lt;input  type="text"  onChange={(e) =gt; setSongName(e.target.value)}  value={songName}  placeholder="Song Name"  name="Song Name"  /gt;  lt;input  type='file'  onChange={(e) =gt; { setSongSelected(e.target.files[0]) }}  placeholder="Song Link"  name="Audio File"  /gt;  lt;button type="submit"gt;Submitlt;/buttongt;    lt;/formgt;  lt;/divgt;  ); };  export default SongForm;  

Ответ №1:

Вы можете передать setAddShowForm функцию в форму в качестве реквизита и обновить ее состояние после отправки (обратите внимание, что вы можете использовать amp;amp; ее для условного рендеринга).:

 lt;divgt;  lt;button onClick={addFormCheck}gt;add a songlt;/buttongt;  {addShowForm amp;amp; lt;SongForm setAddShowForm={setAddShowForm}/gt;} lt;/divgt;  

Измените объявление компонента на

 const SongForm = ({ setAddShowForm }) =gt; {  

И обновите состояние в handleSubmit методе:

 const handleSubmit = async (e) =gt; {  e.preventDefault();    const formData = new FormData();  formData.append('file', songSelected);  formData.append('upload_preset', 'd3gthd7l');    if (songSelected === '') {  setErrors(['You have to upload an audio file!']);  }    Axios.post(  'https://api.cloudinary.com/v1_1/dyhfkvy6u/video/upload',  formData  ).then(async (response) =gt; {  if (response.data.url) url = response.data.url;  const newSong = {  songName,  songLink: url,  userId,  };  const song = await dispatch(postSong(newSong)).catch(async (res) =gt; {  const data = await res.json();  if (data amp;amp; data.errors) setErrors(data.errors);   // Hide the form   setAddShowForm(false);  });  });  };   

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

1. Хм, я написал весь код точно так, как у вас было, но он все еще не скрывает форму при отправке. Я чувствую, что это что-то такое маленькое, чего мне не хватает. Это действительно хорошая идея, хотя я думаю, что мы на правильном пути. обновление Я переместил форму setaddshow(false) над .post, и теперь она работает, поэтому я думаю, что мне просто нужно найти подходящее место для нее.

2. Хорошо, я понял, мне просто нужно было добавить еще к условию ошибок

Ответ №2:

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