В вашем эффекте отсутствуют зависимости: clearValues, getNoteById и note. Вы должны пропустить setValue к initialValue и выполнить const [value, setValue] = useState(initialValue);
, потому что эффект запускается после , рендер и примечание будут неопределенными при первом рендеринге. Убедитесь, что примечание не определено с помощью if(note!==undefined){setValue(JSON.parse(note))}
.
Ваш код должен выглядеть примерно так:
const TextEditor = ({ note, getNoteById, clearValues }) => {
const paramId = match.params.notes;
const [value, setValue] = useState(initialValue);
useEffect(() => {
getNoteById(paramId);
if(note!==undefined) {
setValue(JSON.parse(note));
}
return () => {
clearValues();
};
}, [clearValues, getNoteById, note, paramId, value]);
return (
<div>
<h1> {value} </h1>
</div>
);
};
Я предполагаю, что вы не хотите отправлять getNoteById снова, когда примечание загружается и устанавливается в избыточном состоянии. Возможно создать 2 эффекта:
const TextEditor = ({ note, getNoteById, clearValues }) => {
const paramId = match.params.notes;
const [value, setValue] = useState(initialValue);
//dispatch getNoteById when param id changes
useEffect(() => {
getNoteById(paramId);
return () => {
//dispatch a cleanup action
clearValues();
};
}, [clearValues, getNoteById, paramId]);
//set the note to it's parsed json when it changes
// and is not undefined
useEffect(() => {
if (note !== undefined) {
setValue(JSON.parse(note));
}
}, [note]);
return (
<div>
<h1> {value} </h1>
</div>
);
};