【问题标题】:How to close a modal on browser back button using react-router-dom?如何使用 react-router-dom 关闭浏览器后退按钮上的模式?
【发布时间】:2020-05-05 00:11:12
【问题描述】:

我正在使用react-router-dom,我想要的是能够在我单击浏览器后退按钮时关闭模态框。

另外,在我的场景中,模态组件不是Switch 的一部分。那么如何关闭模态框。

提前致谢。 :)

【问题讨论】:

标签: html reactjs dom react-router-v4 react-router-dom


【解决方案1】:

我制作了一个名为 useAppendLocationState 的简单钩子,它可以完成所有工作:

function SomeComponent() {
    const [showModal , appendShowModal ] = useAppendLocationState('showModal');

    return (
        <div>
            <div>...some view...</div>
            <button onClick={() => appendOpenModal(true)}>open modal</button>
            {showModal && <SomeModal closeHandler={() => window.history.back()} />}
        </div>
    )
}

useAppendLocationStateuseState一样返回一个包含两个条目的数组,第一个条目是来自浏览器位置状态的状态属性值,第二个条目是推送新项目的方法浏览器历史记录,将新的状态道具附加到当前位置状态。

这是我们的useAppendLocationState 定义:

import { useHistory } from 'react-router';

export function useAppendLocationState(key) {
    if (!key) throw new Error("key cannot be null or empty value")

    const history = useHistory()
    const currentLocationState = history.location.state;

    const appendStateItemValue = (value) => {
        const newLocationState = { ...currentLocationState }
        newLocationState[key] = value;
        history.push(history.location.pathname, newLocationState)
    }

    const stateItemValue = history.location.state && history.location.state[key]


    return [stateItemValue, appendStateItemValue]
}

export default useAppendLocationState

【讨论】:

    【解决方案2】:

    您可能会使用类似的方法来检测“返回”按钮的按下情况。

    componentDidUpdate() {
      window.onpopstate = e => {
        
      }
    }
    

    然后,根据您的模式(Bootstrap 或其他),您可以调用 .hide().close()

    【讨论】:

    • 那么当我关闭Modal时,在这种情况下如何禁用后退按钮?
    • 你的意思是反过来?您需要知道(在您的状态下)模态是否已关闭,并且当“onpopstate”再次触发时,您可以 e.preventDefault() 它。但它可能不适用于所有浏览器。
    • 不,我的意思是,当我按下浏览器的后退按钮时。我希望模态框关闭而不返回上一个屏幕
    【解决方案3】:

    您是否尝试过:ComponentWillUnmount?

    【讨论】:

    • 如何使用ComponentWillUnmount?
    猜你喜欢
    • 2018-12-25
    • 1970-01-01
    • 2016-06-09
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    相关资源
    最近更新 更多