#javascript #reactjs
Вопрос:
У меня есть существующая задача с названием и описанием, и я хочу перейти к форме редактирования. По умолчанию я хочу, чтобы существующие значения заголовка и описания заполняли входные данные с помощью React. Важная часть этого кода, о которой я спрашиваю, заключается value={task.title}
в следующем . Пожалуйста, не обращайте внимания на то, как поступают данные (я новичок в реагировании и экспериментирую). Дескрипторы onChange и onSubmit работают правильно, но ошибка, очевидно, указывает на то, что я делаю это неправильно, и это вызывает случайные ошибки.
Я также пытался абстрагировать эти значения в какое-то состояние formValues, но независимо от того, как вводятся значения, если value={howeverIDoIt}
ими непосредственно манипулируют, я получаю ошибку.
import React, { useEffect, useState } from 'react';
import { HEADERS, TODO_URL } from '../urls';
import { useHistory, useParams } from 'react-router-dom';
const TaskEdit = () => {
const [task, setTask] = useState({});
const { id } = useParams();
const history = useHistory();
useEffect(() => {
fetch(`${TODO_URL}/api/tasks/${id}/`, {headers: HEADERS})
.then(response => response.json())
.then(responseJson => {
setTask(responseJson);
});
}, []);
const handleChange = (e) => {
setTask(e.target.value)
}
const handleSubmit = (e) => {
e.preventDefault();
const body = {
'title': e.target.form[0].value,
'description': e.target.form[1].value
}
fetch(
`${TODO_URL}/api/tasks/${id}/edit/`,
{
headers: HEADERS,
method: 'PUT',
body: JSON.stringify(body)
}
).then(res => res).catch(err => err);
history.push(`/task/${id}`)
}
return (
<form>
<div>
<label>Title</label>
<input type="text" onChange={handleChange} value={task.title} />
</div>
<div>
<label>Description</label>
<textarea onChange={handleChange} value={task.description}></textarea>
</div>
<button onClick={handleSubmit}>Submit</button>
</form>
);
}
export default TaskEdit;
Я попытался ввести значение по умолчанию для useState следующим образом: useState({title: 'title', description: 'description'})
но это не предотвращает ошибку и не добавляет эту форму редактирования в Task.js компонент, где task
наиболее определенно определен.
Ответ №1:
У тебя есть:
<input type="text" onChange={handleChange} value={task.title} />
Ваш handleChange
метод заключается в:
const handleChange = (e) => {
setTask(e.target.value)
}
Когда вы onChange
сработаете, вашему task
состоянию будет присвоено значение строки (значение <input />
)
Поэтому, когда вы ссылаетесь task.title
после своих onChange
пожаров, это будет неопределенно. То же самое верно и для task.description
.
Попробуйте это:
const handleTitleChange = (e) => {
setTask({...task, title: e.target.value})
}
const handleDescriptionChange = (e) => {
setTask({...task, description: e.target.value})
}
<input type="text" onChange={handleTitleChange} value={task.title} />
<textarea onChange={handleDescriptionChange} value={task.description} />
В качестве альтернативы вы можете разделить task
состояние на title
и description
, соответственно.
Комментарии:
1. Большое спасибо! Так что просто для справки другим людям в будущем, поскольку мой пост в некотором роде повсюду (как и мои знания о реакции), использование ваших методов onChange с состоянием по умолчанию `useState({заголовок:», описание: «}) исправляет ошибку. Я видел по всему Интернету о состоянии по умолчанию с использованием пустых строк, которое не работало из-за того, что мой метод onChange делал другие аспекты моего объекта задачи неопределенными. Большое спасибо!