Обновление значения текстового поля через событие OnChange

Я показываю и заполняю (из источника данных) набор записей. Но я не могу изменить значения в полях. Событие OnChange установлено неправильно? Это происходит перед отправкой формы — мне просто нужно иметь возможность изменять отображаемое содержимое текстового поля через пользовательский интерфейс. Мне интересно, нужен ли ему также идентификатор обновляемой записи. Я также должен добавить, что у меня есть UseEffect, который заполняет таблицу. Может быть, он вызывается каждый раз, когда я пытаюсь изменить текстовое поле? В консоли Dev Tools нет ошибок.

{cookies.map(cookie =>
   <form key = {cookie.id}>
     <input type = "text" name = "id" onChange = {handleInput}  value = {cookie.id}></input>
     <input type = "text" name = "name" onChange = {handleInput}  value = {cookie.name}></input>
     <input type = "text" name = "desc" onChange = {handleInput}  value = {cookie.desc}></input>
     <input type = "text" name = "price" onChange = {handleInput}  value = {cookie.price}></input>
     <input type = "submit"></input>
  </form>
 )}

   useEffect(() => {
    populateCookieData();
  }, []);

  async function populateCookieData() {
  const response = await fetch('cookie/GetAllCookies');
  const data = await response.json();
  setCookies(data);
}

 const [cookies, setCookies] = useState();
 const [postdata, setPostdata] = useState({})

const handleInput = (event) => {
 setPostdata({ ...postdata, [event.target.name]: 
 event.target.value })
  }

вам нужны поля имени в элементах ввода

Max 11.06.2024 20:30

Не могли бы вы уточнить?

John 11.06.2024 20:32

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

Max 11.06.2024 20:45

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

John 11.06.2024 20:46

Я разместил ответ с кратким объяснением атрибута name для элементов html, того, что используют формы html, и поскольку это также js для получения значений, я могу добавить некоторые подробности, если есть что-то конкретное, на чем я могу сосредоточиться на lmk

Max 11.06.2024 20:46

Я отредактировал вопрос, добавив имена. Это все еще не позволяет мне изменить значение текстового поля.

John 11.06.2024 20:51

Нам не нужно видеть C#, но нам нужно увидеть остальную часть компонента. В частности, что такое cookies и как он устанавливается, а также состояние, связанное с setPostdata.

Brian Thompson 11.06.2024 21:23

Просто добавил остальную часть компонента. Чего-то еще не хватает?

John 11.06.2024 21:29

Ваши входные значения определяются состоянием cookies, но ваш обработчик изменений обновляет состояние postdata. Таким образом, вы никогда не увидите изменений, но ваше состояние postdata, скорее всего, обновляется правильно.

Brian Thompson 11.06.2024 21:46

Есть ли способ обновить эти поля в режиме реального времени перед отправкой на сервер? Будет ли это встроено в метод populatecookiedata?

John 11.06.2024 22:09

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

Max 12.06.2024 19:48
Как конвертировать HTML в PDF с помощью jsPDF
Как конвертировать HTML в PDF с помощью jsPDF
В этой статье мы рассмотрим, как конвертировать HTML в PDF с помощью jsPDF. Здесь мы узнаем, как конвертировать HTML в PDF с помощью javascript.
0
11
75
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Чтобы использовать event.target.name, для элементов, определенных в html/jsx, должен быть определен атрибут name. Например, для ввода id, если postData ожидает атрибут id, вам понадобится

<input type = "text" onChange = {handleInput} name = "id" value = {cookie.id}></input>

скорее, чем

<input type = "text" onChange = {handleInput} value = {cookie.id}></input>

потому что без этого форма фактически не сможет узнать, где искать данные.

Теперь, если у вас есть имена, обработчики могут разрешить целевые данные, если использовать поля имени целевого объекта в событии.

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

если вы храните данные в cookies, это в форме {id:number(or string), name:string, desc:price, price:number}[]

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

Итак, один из способов сделать так, чтобы имя было некоторым значением, из которого вы можете переиндексировать этот data объект примерно так const name=(index:number)=>(property:string)=>${index}/${property}, а затем при установке значения вы можете сделать что-то вроде

const handleInput = (event) => {
  const [index, property] = event.target.name.split("/");
  setCookies((data) =>
    data.map((row, idx) =>
      idx === parseInt(index)
        ? { ...row, [property]: event.target.value }
        : row,
    ),
  );
};

или вы можете назначить отдельные обработчики входам для обновления значения, например

const createHandleInput = (index:number)=>(property:string)=>setCookies((data) =>
    data.map((row, idx) =>
      idx === index
        ? { ...row, [property]: event.target.value }
        : row,
    ),
  );

а потом

{
  cookies.map((cookie, index) => {
    const getInputHandler = createHandleInput(index);
    return (
      <form key = {cookie.id}>
        <input type = "text" onChange = {getInputHandler("id")} value = {cookie.id}></input>
        <input type = "text" onChange = {getInputHandler("name")} value = {cookie.name}></input>
        <input type = "text" onChange = {getInputHandler("desc")} value = {cookie.desc}></input>
        <input type = "text" onChange = {getInputHandler("price")} value = {cookie.price}></input>
        <input type = "submit"></input>
      </form>
    );
  });
}

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

Тогда я все еще думаю, что вам следует использовать кнопку для отправки, и на этом этапе вам даже не нужно состояние postData, вы можете просто опубликовать любую строку из данных состояния cookies. если только вы действительно не хотите публиковать только те, которые были явно обновлены, но обычно это не имеет значения.

Таким образом, у вас может быть что-то похожее на то, что у нас было раньше.

const createSubmitHandler = (index: number) => {
  const data = cookies[index];
  // whatever submit logic you want
};

и

{
  cookies.map((cookie, index) => {
    const getInputHandler = createHandleInput(index);
    return (
      <form key = {cookie.id}>
        <input type = "text" onChange = {getInputHandler("id")} value = {cookie.id}></input>
        <input type = "text" onChange = {getInputHandler("name")} value = {cookie.name}></input>
        <input type = "text" onChange = {getInputHandler("desc")} value = {cookie.desc}></input>
        <input type = "text" onChange = {getInputHandler("price")} value = {cookie.price}></input>
        <button type = "button" onClick = {createSubmitHandler(index)}>
          sumit
        </button>
      </form>
    );
  });
}

Только что попробовал. Тот же результат.

John 11.06.2024 20:40

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