#javascript #reactjs
#javascript #reactjs
Вопрос:
В React у меня есть перехват с именем «примечание», где у меня установлено состояние для создания объекта. Этот объект загружается с некоторой информацией о заполнителе, когда я сначала создаю карточку, а затем эта информация загружается в «addNote», который создает новую заметку и сохраняет ее в массиве заметок. Когда я хочу восстановить эту заметку, она запускает showCard, где карточка должна быть извлечена и загружена обратно в форму. Смотрите ниже
const [notes, setNotes] = useState([]);
const [showCreate, setCreate] = useState(false);
const [note, setNote] = useState({});
let currentNote = {};
function toggleCreateCard() {
setCreate(oldCreate => !oldCreate);
}
function addNote(newNote) {
setNotes(prevNotes => {
return [...prevNotes, newNote];
});
}
function createNewCard(newItem) {
setNote({
header: newItem,
content: "",
checklist: [],
pictures: [],
dueDate: "",
comments: []
});
toggleCreateCard();
}
function showCard(id) {
currentNote = notes[id];
setNote(currentNote);
toggleCreateCard();
}
Проблема, с которой я сталкиваюсь, заключается в том, что let «currentNote» правильно извлекает заметку из массива notes. Однако, когда я пытаюсь обновить состояние заметки, заголовок загружается некорректно. Кажется, что сохраняется последнее состояние «примечание», когда был запущен процесс создания карточки.
Вверху приведен пример объекта, который должен быть загружен в перехват, а внизу — пример того, что на самом деле загружается в перехват
index.js:27 {header: "test", content: "test1234 test1234 test1234 test1234 test1234 test1…234 test1234 test1234 test1234 test1234 test1234 ", checklist: Array(2), pictures: Array(0), dueDate: "", …}
index.js:27 {header: "test", content: "", checklist: Array(0), pictures: Array(0), dueDate: "", …}
Как мне правильно обновить состояние note?
ПРАВКА 1 (дополнительная информация): функции «createNewCard» и «showCard» вызываются двумя компонентами, приведенными ниже:
<Body
noteList={notes}
removeCard={deleteNote}
submitNote={addNote}
showCard={showCard}
/>
{showCreate ? (
<CreateCard
note={note}
addNote={addNote}
createOff={toggleCreateCard}
/>
Обычно примечание загружается специально для компонента «CreateCard», который вызывает это и включает подкомпоненты для отдельных полей формы, чтобы сделать его более читаемым
const [loadNote, setNote] = useState({
header: props.note.header,
content: props.note.content,
checklist: props.note.checklist,
pictures: props.note.pictures,
dueDate: props.note.dueDate,
comments: []
});
function handleChange(event) {
setNote(prevNote => {
return {
...prevNote,
[event.name]: event.value
};
});
}
function submitNote() {
props.addNote(loadNote);
props.createOff();
}
return (
<form
className="create-card form-styling shadow-15px lato"
onKeyPress={e => {
e.key === "Enter" amp;amp; e.preventDefault();
}}
>
<Title header={loadNote.header} update={handleChange} />
<Description description={loadNote.content} update={handleChange} />
<Checklist checklist={loadNote.checklist} update={handleChange} />
<Pictures pictures={loadNote.pictures} update={handleChange} />
<DueDate duedate={loadNote.dueDate} update={handleChange} />
<Fab color="primary" aria-label="add" size="small" onClick={submitNote}>
<AddIcon />
</Fab>
</form>
);
Весь проект прямо сейчас находится в code sandbox, если требуется более подробная информация https://codesandbox.io/s/ideaboard-listing-tool-n0je5?file=/src/components/App.jsx:1263-1539
Комментарии:
1. Привет, что ты передаешь в id в showCard? id. Вы пытаетесь ссылаться на массив по индексу. Также, где вы регистрируете примечание, setNote — это асинхронный метод.
2. да, я передаю индекс для идентификатора в showCard. что касается записи, я настроил консоль. регистрируется после «currentNote = notes[id];» для первого примера и «setNote(currentNote);» для второго примера. То, что на самом деле отображается на карточке прямо сейчас, — это просто название объекта в массиве Notes, даже если в note есть приведенный пример, но прямо сейчас я пытаюсь выяснить, почему я не могу заставить note правильно обновляться
3. Правильно, значит, строка после setNote, примечание еще не имеет значения. В этом сообщении в блоге говорится о том, что перехваты являются асинхронными и как это обойти, возможно, это поможет: sung.codes /blog/2018/12/07/ …
4. Чао, тебе нужно добавить больше кода, чтобы лучше понять твою проблему. Кто вызывает
createNewCard
,showCard
иaddNote
?5. @GiovanniEsposito Я добавил больше деталей и ссылку на всю изолированную среду кода, если потребуется что-то еще помимо этого.
Ответ №1:
Итак, я, по-видимому, бегал кругами, преследуя свой собственный хвост. Сами данные фактически уже отправлялись на карту, у меня просто не было правильных имен свойств, которые вызывались, поэтому я получал только свое название карты и никакой другой информации. Из-за этого все попытки консольного логирования данных, поступающих на карту, были спорными. Я все еще не могу сказать, что понимаю функциональность асинхронности, но, по крайней мере, я получаю данные в