React.js, изменение переменной useReducer только при повторном клике

Предположим, что имеется некая форма с кнопкой, в которой по умолчанию переменная startPage равна true, при нажатии по кнопке значение startPage изменяется на false и на форме отображается стрелка, при нажатии на которую можно вернуться к стартовой форме. Действительно, при нажатии на стрелку форма переходит к стартовому виду, но стрелка при этом не пропадает, а пропадает лишь при повторном нажатии на нее.

Компонент который содержит саму стрелку

function Form() {
    const { startPage, hideArrow } = useContext(CloseContext)

    return (
        <>
            <div className="app__container absolute-center">
                {startPage ? '' : <LeftArrow className="app__close-button" onClick={() => hideArrow()} />}
                <div className="app__content-left">
                    <img src="img/img-2.svg" alt="" className="app__main-image absolute-center" />
                </div>
                <div className="app__content-right">
                    <EnterType />
                </div>
            </div>
        </>
    )
}

Для работы с изменением значений отображения стрелки используется Context и useReducer(в документации упоминается, что в Context лучше использовать именно его, вместо useState)

export const CloseContext = createContext()

function reducer(state, action) {
    switch (action.type) {
        case 'HIDE': return { startPage: true };
        case 'VISIBLE': return { startPage: false };
        default: return state;
    }
}

const CloseContextProvider = ({ children }) => {
    const [state, dispatch] = useReducer(reducer, { startPage: true });
    const { isSubmitted, cancelForm } = useContext(FormTransitionContext)

    const visibleArrow = () => {
        dispatch({
            type: 'VISIBLE'
        })
    }

    const hideArrow = () => {
        dispatch({
            type: 'HIDE'
        })
        isSubmitted && cancelForm()
    }

    return (
        <CloseContext.Provider value={{ startPage: state.startPage, visibleArrow, hideArrow }}>
            {children}
        </CloseContext.Provider>
    )
}

export default CloseContextProvider

Ответы (0 шт):