简体   繁体   English

在 SPA 中使用 React Router 来处理历史记录,包括浏览器后退按钮按下?

[英]Using React Router in a SPA to handle history, including browser back button press?

I was trying to find a related question SO, but I haven't been able to.我试图找到一个相关的问题,但我没能找到。

In a SPA, clicking the browser's back button won't take the user to the previous view of your app -- it'll take you to whichever previous website you've visited.在 SPA 中,单击浏览器的后退按钮不会将用户带到您的应用程序的上一个视图——它会将您带到您之前访问过的任何网站。

I've tried doing something like the below:我试过做类似下面的事情:

import React from 'react';
import { useDispatch } from 'react-redux';
import { useHistory } from 'react-router-dom';
import styled from 'styled-components';

const Part0 = ({ history }) => {
    React.useEffect(() => {
        return () => {
            if (history?.action === 'POP') {
                console.log('pop0');
                history.goBack();
            }
        };
    }, []);

    return <ComponentContainer>part0</ComponentContainer>;
};

const Part1 = ({ history }) => {
    React.useEffect(() => {
        return () => {
            if (history?.action === 'POP') {
                console.log('pop1');
                history.goBack();
            }
        };
    }, []);

    return <ComponentContainer>part1</ComponentContainer>;
};

export default function Component() {
    const [page, setPage] = React.useState(0);
    const history = useHistory();
    const dispatch = useDispatch()

    const handleBack = React.useCallback(() => {
        history.goBack();
    }, []);

    const handleForward = React.useCallback(() => {
        history.push('');
        setPage(page + 1);
    }, [page]);

    return (
        <Main>
            <ContentContainer>
                {page === 0 && <Part0 history={history} />}
                {page === 1 && <Part1 history={history} />}
                <ButtonContainer>
                    <Button onClick={handleBack}>back</Button>
                    <Button onClick={handleForward}>forward</Button>
                </ButtonContainer>
            </ContentContainer>
        </Main>
    );
}

const Main = styled.div`
    display: flex;
    align-items: center;
    justify-content: center;
`;

const ContentContainer = styled.div`
    height: 20vh;
`;

const ButtonContainer = styled.div`
    display: flex;
    justifyContent: space-between;
    alignItems: flex-end;
    height: 100%;
    width: 25vw;
`

const Button = styled.div`
    width: 8rem;
    cursor: pointer;
    height: 3rem;
    border: 1px solid gray;
    display: flex;
    justify-content: center;
    align-items: center;
    border-radius: 0.5rem;
    transition: 0.5s;

    &:hover {
        background-color: #f1f1f1;
    }
`;

const ComponentContainer = styled.div`
    display: flex;
    align-items: center;
    justify-content: center;
    width: 100%;
    height: 100%;
`;

The related part is the history.push('');相关部分是history.push(''); whenever the user decides to move forward and the history.goBack() for when the user decides to click the browser's back button.每当用户决定向前移动时, history.goBack()用于用户决定单击浏览器的后退按钮时。

This didn't work, unfortunately.不幸的是,这不起作用。 Is it possible to be able to handle the user clicking the browser's back button in a SPA with React?是否可以使用 React 处理用户在 SPA 中单击浏览器的后退按钮?

To answer your question, you can intercept the back button event like this:要回答您的问题,您可以像这样拦截后退按钮事件:

componentDidMount() {
    this.backListener = browserHistory.listen(location => {
      if (location.action === "POP") {
        // Do your stuff
      }
    });
  }

componentWillUnmount() {
    super.componentWillUnmount();
    // Unbind listener
    this.backListener();
}

as was answered in here正如在这里回答的那样

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM