#javascript #reactjs #next.js #use-state
#язык JavaScript #реагирует на #next.js #состояние использования
Вопрос:
Я пытаюсь обновить значение состояния и отобразить это обновленное значение в поле ввода, но, похоже, у меня ничего не получается.
Я просматривал различные статьи и ответы, но ни один из способов, похоже, не работает для меня, возможно, я делаю что-то не так.
const AnswerDetailOptions = ({ options, className, answer_id, last_review_details }) =gt; { const [reviewNoteDisplay, setReviewNoteDisplay] = useState(last_review_details.note) const [reviewNoteTimeStamp, setReviewNoteTimeStamp] = useState(last_review_details.date_time) useEffect(() =gt; { // test }, [reviewNoteDisplay]) const submitReview = async () =gt; { const payload = { note: reviewNote, answer_id } const response = await submitNewReview(payload) //console.log(response) if (response.status === 201) { toast.success('Review saved successfully') setReviewNoteDisplay(() =gt; return response.data.data.note) setReviewNoteTimeStamp(() =gt; return response.data.data.date_time) closeCreateReviewDialog() } else { toast.error('Failed to save review') } }
Оказывать:
{ reviewNoteTimeStamp ? lt;gt; lt;EditableText multiline="true" placeholder="Write a review..." defaultValue={reviewNoteDisplay} confirmOnEnterKey="true" onChange={(new_value) =gt; setReviewNoteDisplay(new_value)} onConfirm={editReview} /gt; lt;p className={classNames(styles.node, styles.reviewTimeStamp)}gt;{ format(new Date(reviewNoteTimeStamp), 'dd/MM/yyyy, hh:mm a') }lt;/pgt; lt;Button onClick={() =gt; setShowReviewHistory(true)}gt;Review Historylt;/Buttongt; lt;/gt; : lt;gt; lt;pgt;No reviews addedlt;/pgt; lt;/gt; }
Я пытаюсь получить новое значение reviewNoteDisplay
и reviewNoteTimeStamp
, но я продолжаю получать старое значение.
Комментарии:
1. вы пробовали это так:
setReviewNoteDisplay(response.data.data.note)
?2. ДА. Я так и сделал, но ничего не работает.
3. где находится поле ввода? я не вижу этого в вашем примере кода.
4.
setReviewNoteDisplay(() =gt; return response.data.data.note)
является недопустимым кодом, используйтеsetReviewNoteDisplay(() =gt; response.data.data.note)
илиsetReviewNoteDisplay(response.data.data.note)
5. ваши настройки
defaultValue={reviewNoteDisplay}
будут обновлены только в том случае, если элемент будет создан заново. я попытаюсь опубликовать решение
Ответ №1:
ваш ввод должен контролировать ввод, использовать value
и не defaultValue
здесь:
lt;EditableText multiline="true" placeholder="Write a review..." value={reviewNoteDisplay} confirmOnEnterKey="true" onChange={(new_value) =gt; setReviewNoteDisplay(new_value)} onConfirm={editReview} /gt;
я не знаю компонента EditableText, но если onChange
он не срабатывает при каждом нажатии клавиши, вам также может потребоваться добавить:
onKeyUp={(e) =gt; setReviewNoteDisplay(e.target.value)}
или что-то в этом роде.
Комментарии:
1. Ты был прав. Это должен был быть контролируемый компонент. Теперь это работает. Огромное спасибо.