Я продолжаю терять свои значения, сохраненные в let, каждый раз, когда я вызываю set State

#javascript #reactjs

Вопрос:

Я пытаюсь отобразить имя изображения, когда оно загружается в форму. Итак, я создал для этого состояние. У меня есть функция, которая обрабатывает загрузку изображений, и другая функция, которая отправляет форму. Итак, я должен объявить FormData вне функции, потому что я хочу отправить и изображение, и форму одновременно. Проблема в том, что вызов setState() повторной визуализации приводит к повторной загрузке загруженного изображения. Я уже нашел решение, сохранив изображение в состоянии, следовательно, оно не теряет данные после повторного рендеринга. Я хочу выяснить, есть ли лучший способ сделать это.

 const [ImageUploaded, setImageUploaded] = useState('')  
const [response, setResponse] = useState(null)
const [error, setError] = useState(null)
const [loading, setLoading] = useState(false)

let fd = new FormData()
const onImageUpload = async (e) => {
    let file = e.target.files[0]
    fd.append('file', file)
    setImageUploaded(file.name)// this causes a re-render and fd re-initializes and data saved is lost
}
const uploadProduct = async(e) => {
    e.preventDefault()
    setLoading(true)
    try {
        const productData = {
        productName: inputState.productName.value,
        description: inputState.description.value,
        price: inputState.price.value,
        quantity: inputState.quantity.value
    }
    const {data} = await axios.post('/api/products/new', productData)
    const response = await axios.post(`/api/upload/${data.id}`, fd, {
        headers: { 'Content-Type': `multipart/form-data` },
        onUploadProgress: (uploadState) => console.log(uploadState.loaded)
    })
    setLoading(false)
    if (response.status===200) {
        setResponse(true)
    }
    } catch (error) {
        setLoading(false)
        setError(true)
    } 
}
 

Комментарии:

1. каждый раз, когда компонент повторно объявляется fd . Если вам нужно сохранить значение, но не запускать рендеринг при изменении, используйте ссылку .

Ответ №1:

Вы можете использовать let ImageUploaded, за исключением использования этого параметра в случае useState. Потому что, когда вы используете useState для своих переменных, ваш текущий рендеринг детали и ваши предыдущие данные let могут быть потеряны.