Странное поведение React ловит, не может получить доступ к новому состоянию из функции - PullRequest
1 голос
/ 08 мая 2019

Я использую библиотеку react-use-modal, и Я пытаюсь прочитать обновленное значение confirmLoading в функции handleClick.

handleClick читает первое значение confirmLoading, определенное при выполнении const [ confirmLoading, setConfirmLoading ] = useState(false), но никогда не обновляется, когда я setConfirmLoading внутри handleOk.

Я не понимаю, что я делаю неправильно

import { Button, Modal as ModalAntd } from 'antd'
import { useModal } from 'react-use-modal'

export interface ModalFormProps {
    form: React.ReactElement
}

export const ModalForm: React.FC = () => {
    const [ confirmLoading, setConfirmLoading ] = useState(false)
    const { showModal, closeModal } = useModal()

    const handleOk = () => {
        setConfirmLoading(true)
        setTimeout(() => {
            setConfirmLoading(false)
            closeModal()
        }, 1000)
    }

    const handleCancel = () => {
        closeModal()
    }

    const handleClick = () => {             
        showModal(({ show }) => (
            <ModalAntd                  
                onCancel={handleCancel}
                onOk={handleOk}
                title='Title'
                visible={show}
            >
                //  the value of confirmLoading is always the one defined 
                //  with useState at the beginning of the file.
                <p>{confirmLoading ? 'yes' : 'no'}</p>                  
            </ModalAntd>
        ))
    }

    return (
        <div>
            <Button onClick={handleClick}>
                Open Modal
            </Button>
        </div>
    )
}

1 Ответ

3 голосов
/ 08 мая 2019

Это происходит из-за замыканий.Компонент, который вы передаете showModal, запоминает confirmLoading, и когда вы вызываете функцию setConfirmLoading, ваш компонент снова рендерится, а функция handleClick воссоздается.«Старый» handleClick и «старый» компонент в showModal ничего не знают о новом значении в confirmLoading.

Попробуйте сделать это:

export const ModalForm: React.FC = () => {
    const { showModal, closeModal } = useModal();

    const handleClick = () => {

        showModal(({ show }) => {
            const [ confirmLoading, setConfirmLoading ] = useState(false);
            const handleOk = () => {
                setConfirmLoading(true)
                setTimeout(() => {
                    setConfirmLoading(false)
                    closeModal()
                }, 1000)
            };

            const handleCancel = () => {
                closeModal()
            };

            return (
                <ModalAntd
                    onCancel={handleCancel}
                    onOk={handleOk}
                    title='Title'
                    visible={show}
                >
                    // the value of confirmLoading is always the one defined
                    // with useState at the beginning of the file.
                    <p>{confirmLoading ? 'yes' : 'no'}</p>
                </ModalAntd>
            );
        })
    };

    return (
        <div>
            <Button onClick={handleClick}>
                Open Modal
            </Button>
        </div>
    )
}


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...