Состояние api хука React иногда пусто

Я использую API-интерфейс для управления состоянием, проблема в том, что состояние иногда бывает пустым в функции обработчика.

Я использую компонент для управления contenteditable(используя из npm) lib. Вы можете писать в компонент, и при входе вы можете отправить событие родителю.

См. Мой пример:

import React, { useState } from "react"
import css from './text-area.scss'
import ContentEditable from 'react-contenteditable'
import { safeSanitaze } from './text-area-utils'

type Props = {
    onSubmit: (value: string) => void,
}

const TextArea = ({ onSubmit }: Props) => {
    const [isFocused, setFocused] = useState(false);
    const [value, setValue] = useState('')

    const handleChange = (event: React.FormEvent<HTMLDivElement>) => {
        const newValue = event?.currentTarget?.textContent || '';
        setValue(safeSanitaze(newValue))
    }

    const handleKeyPress = (event: React.KeyboardEvent<HTMLDivElement>) => {
        // enter
        const code = event.which || event.keyCode
        if (code === 13) {
            console.log(value) // THERE IS A PROBLEM, VALUE IS SOMETIMES EMPTY, BUT I AM SURE THAT TEXT IS THERE!!!
            onSubmit(safeSanitaze(event.currentTarget.innerHTML))
            setValue('')
        }
    }

    const showPlaceHolder = !isFocused && value.length === 0

    const cls = [css.textArea]
    if (!isFocused) cls.push(css.notFocused)

    console.log(value) // value is not empty

    return (
        <ContentEditable
            html={showPlaceHolder ? 'Join the discussion…' : value}
            onChange={handleChange}
            className={cls.join(' ')}
            onClick={() => setFocused(true)}
            onBlur={() => setFocused(false)}
            onKeyPress={handleKeyPress}
        />
    )
}

export default React.memo(TextArea)

Основная проблема в том, что внутри handleKeyPress (после нажатия клавиши ввода) value(из состояния) пустая строка, почему? - в блокеconsole.log(value) // THERE IS A PROBLEM, VALUE IS SOMETIMES EMPTY, BUT I AM SURE THAT TEXT IS THERE!!! Я не понимаю что не так??

1 ответ

Значение пусто, потому что onChange фактически не меняет его, что означает

const newValue = event?.currentTarget?.textContent || '';

эта строка не выполняет то, что должна. Я думаю, тебе следует прочитатьtarget prop в синтетических событиях реакции вместо currentTarget. Итак, попробуйте это вместо

const newValue = event.target?.value || '';

Надеюсь это поможет.

Другие вопросы по тегам