在后退按钮点击 (REACTJS) 上执行代码

IT技术 javascript reactjs
2021-05-12 11:00:02

例如,当我将一个页面浏览到另一个页面时,将执行以下代码。当我从类别页面列表中单击产品时,下面的代码会设置一个会话存储键,该键将具有类别页面的位置(滚动了多少页面)。

所以当产品页面打开时,它会在会话中保存它的密钥,如果它再次访问相同的类别页面,它会恢复页面位置。

我试图让这段代码只保存一个会话密钥并删除以前保存的会话密钥,无论用户点击网站的哪个页面(即类别页面、产品页面)。

CategoryPage.js

const [scrollPosition, setScrollPosition] = React.useState('');

 React.useEffect(() => {
   var pathName = document.location.pathname.substr(1);
   if (window) {
     window.onscroll = function (e) {
       setScrollPosition(window.scrollY);
       if(scrollPosition != 0){
         sessionStorage.setItem("scrollPosition_"+pathName, scrollPosition);
       }
     };
   }
 }, [scrollPosition]);

 React.useEffect(() => {
   var pathName = document.location.pathname.substr(1);
   if (window && sessionStorage.getItem("scrollPosition_"+pathName)) {
     $(window).scrollTop(sessionStorage.getItem('scrollPosition_'+ pathName));
     console.log('position_set to = ' + sessionStorage.getItem('scrollPosition_'+ pathName));
   }
 }, []);

关于删除以前的会话密钥的任何想法?

2个回答

如果您将 redux 与 react 一起使用,您实际上可以通过发送包含用户在产品页面上的信息的操作来制作一个跟踪位置的减速器。

像这样的东西:

因此,如果您有几条路线,例如:

/category/house/3213124(product_id)
/category/garden/dsfsdfs(product_id)

在您的路由器中,您可以像这样对它们进行寻址:

/category/house/{id}
/category/garden/{id}

然后你可以使用:

let { id } = useParams();

if(id !== undefined || ""){
     dispatch(userIsOnProductPageAction(true))
}

当用户使用减速器的选择器单击后退按钮时您将获得产品页面上的用户信息……如果为,则执行代码,如果为,则什么都不做

同样在执行代码后,您调度userIsOnProductPageAction(false).

如果您不使用 redux,您可以应用相同的逻辑,但问题是您必须wasUserOnPage在类别页面上保持状态并以某种方式访问​​它。

由于我不知道您的 React 应用程序的外观,因此我无法告诉您如何实现。如果产品是子元素,而类别是父元素,通过单击后退按钮,您可能可以通过props发送该信息。

编辑:它应该是这样的

    class main extends React.Component {
  constructor(props) {
    super(props)

    this.handler = this.handler.bind(this)
  }

  handler() {
    this.setState({
      wasOnProductPage:false
    })
  }

  render() {
    return <Category handler = {this.handler} props={this.props.wasOnProductPage} />
            <Product handler = {this.handler} />
  }
}

class Category extends React.Component {
  render() {

    if(props){
        do code for viewport
        then acitave this.props.handler and set it to false
    }
  }
}

class Product extends React.Component {
  render() {
    return <BackButton onClick = {this.props.handler(true)}/ >
  }
}

我的理解是在加载页面时,您想要:

  1. 如果此页面是最后访问的页面:加载其保存的位置。
  2. 否则:删除上次保存的位置并在滚动时保存。

然后看起来您需要使用您正在保存/加载的位置保存某种页面 ID。这个唯一标识符显然可以是 URL。

然后,您可以使用类似版本的代码:

 const [scrollPosition, setScrollPosition] = React.useState('');
 const getPathname = () => document.location.pathname.substr(1);

 React.useEffect(() => {
   if (window) {
     window.onscroll = function (e) {
       setScrollPosition(window.scrollY);
       if (scrollPosition != 0) {
         const savedPosition = { position: scrollPosition, pathName: getPathname() };
         sessionStorage.setItem('scrollPosition', JSON.stringify(savedPosition));
       }
     };
   }
 }, [scrollPosition]);

 React.useEffect(() => {
   const lastSavedPosition = JSON.parse(sessionStorage.getItem('scrollPosition'));
   if (window && lastSavedPosition && getPathname() === lastSavedPosition.pathName) {
      $(window).scrollTop(lastSavedPosition.position);
      console.log(`position_set to = ${lastSavedPosition.position}`);
   }
 }, []);