React/Firebase — событие OnChange запускается, даже если поле не изменилось

Я совсем новичок, поэтому постараюсь объяснить как можно проще. У меня есть простая форма, и я пытаюсь обновить поле. Для обновления я установил следующее:

  1. Сначала получите идентификатор элемента записи, которую я хочу обновить.
  2. Обновите запись в firebase.

Моя проблема в том, что если я изменю значение одного поля, например, «имя», и отправлю форму, «имя» будет успешно обновлено в firebase, однако другое поле в моем случае «описание» также будет обновлено с пустым значением. То же самое происходит, если «описание» изменено, а имя нет.

export default CategoryUpdate
  const CategoryUpdate = () => {

  const [name, setName] = useState("");
  const [description, setDescription] = useState("");
  const params = useParams();  // get category id from url
  const [data, setData] = useState([]);

  useEffect(() => {
      const fetchData = async () => {
          const docRef = doc(db, "category", params.categoryId)
          const docSnap = await getDoc(docRef)
          if (docSnap.exists()){
              setData(docSnap.data())
          }
      };
      fetchData();
  },[params.categoryId]);

  // Updating category in Firebase
  const saveDetails = async () => {
    const updateSchool = {
        name: name,
        description: description,
    };
    try {
        const schoolRef = doc(db, "category", data.id)
        await updateDoc(schoolRef, updateSchool);
    } catch (error) {
        console.info(error);
    }
  }

  return ( 
    <form> 
      <input 
        type = "text" 
        required 
        defaultValue = {data.name || ''} 
        placeholder = "Set a title" 
        onChange = {(e) => setName(e.target.value)} 
      /> 

      <input 
        type = "text" 
        required 
        defaultValue = {data.description || ''} 
        placeholder = "Set a title" 
        onChange = {(e) => setDescription(e.target.value)} 
      /> 

      <div className='flex items-center w-full'> 
        <button type = "button" 
          onClick = {saveDetails}
        > 
          Edit Category 
        </button> 
      </div> 
  </form> 

  ) 
} 

export default CategoryUpdate

Я попытался обновить поле в форме, и я ожидал, что после обновления обновленное поле будет обновлено, а остальные поля сохранят исходные значения до обновления.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
0
113
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

использовать переменные состояния в значении по умолчанию

  <input 
    type = "text" 
    required 
    defaultValue = {name || ''} 
    placeholder = "Set a title" 
    onChange = {(e) => setName(e.target.value)} 
  /> 
  <input 
    type = "text" 
    required 
    defaultValue = {description || ''} 
    placeholder = "Set a description" 
    onChange = {(e) => setDescription(e.target.value)} 
  /> 

И обновить состояние в useEffect

useEffect(() => {
   if (data){
     setDescription(data.description)
     setName(data.name)
   }
}, [data])

Спасибо за комментарий. Но это не решило мою проблему. Это была моя вина из-за копирования / вставки кода. Извините за введение в заблуждение.

paniklas 24.11.2022 14:06

см. обновленный

Sachila Ranawaka 24.11.2022 14:10

Это решило мою проблему. Спасибо за быстрый ответ.

paniklas 24.11.2022 14:30

Другие вопросы по теме