Я показываю и заполняю (из источника данных) набор записей. Но я не могу изменить значения в полях. Событие 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 })
}
Не могли бы вы уточнить?
это также должна быть кнопка, которую нельзя ввести для отправки
Ой, я пока не хочу отправлять. Просто чтобы иметь возможность изменить содержимое текстового поля. В любом случае я бы это представил.
Я разместил ответ с кратким объяснением атрибута name для элементов html, того, что используют формы html, и поскольку это также js для получения значений, я могу добавить некоторые подробности, если есть что-то конкретное, на чем я могу сосредоточиться на lmk
Я отредактировал вопрос, добавив имена. Это все еще не позволяет мне изменить значение текстового поля.
Нам не нужно видеть C#, но нам нужно увидеть остальную часть компонента. В частности, что такое cookies и как он устанавливается, а также состояние, связанное с setPostdata.
Просто добавил остальную часть компонента. Чего-то еще не хватает?
Ваши входные значения определяются состоянием cookies, но ваш обработчик изменений обновляет состояние postdata. Таким образом, вы никогда не увидите изменений, но ваше состояние postdata, скорее всего, обновляется правильно.
Есть ли способ обновить эти поля в режиме реального времени перед отправкой на сервер? Будет ли это встроено в метод populatecookiedata?
да, поскольку вы используете контролируемые входные данные, вы можете просто обновить состояние cookies вместо postdata, я могу обновить ответ с помощью примера.

Чтобы использовать 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>
);
});
}
Только что попробовал. Тот же результат.
вам нужны поля имени в элементах ввода