为啥我的 react-router 链接会将我带到页面中间?

Posted

技术标签:

【中文标题】为啥我的 react-router 链接会将我带到页面中间?【英文标题】:Why does my react-router link bring me to the middle of a page?为什么我的 react-router 链接会将我带到页面中间? 【发布时间】:2020-02-14 08:02:12 【问题描述】:

我的网站上有很多链接,但只有一个可以这样做。

它没有通过导航栏将我带到顶部,而是转到内容的中间。知道为什么会这样吗?

这是一个有一个.map 穿过一些JSON 的页面,它会在页面下方呈现div 文本元素...如果重要的话。

这里有一些可能相关的代码。

路线

<Route exact path ="/reviews" component=Reviews />

链接

                <Link to="/reviews">
                <ViewAllBtn>View All</ViewAllBtn>
            </Link>

着陆页(位于中间而不是顶部)

        <MotherDiv>
        <NavBar />
        <Prompt>
            <PromptHead>Customer Reviews</PromptHead>
            <PromptBody>Heres what our loyal customers think of Heavenly Details.</PromptBody>
        </Prompt>
        <ReviewsDiv>
            reviews.map(review =>
                <ReviewDiv key=review.name>
                    <Name>review.name</Name>
                    <Body>review.body</Body>
                </ReviewDiv >
            )
        </ReviewsDiv>
        <Footer />
    </MotherDiv>

【问题讨论】:

【参考方案1】:

react-router 在 URL 更改时呈现一个新组件,而不是硬刷新页面。这有一个令人讨厌的副作用,它会记住您当前的滚动位置,并且在页面更改时不会自动滚动回页面顶部。

我猜你的问题可能是这里的问题。如果是,那么使用简单的higher order component 就很容易解决这个问题:

class ScrollToTop extends Component 
  componentDidUpdate(prevProps) 
    const  location  = this.props;
    if (location.pathname !== prevProps.location.pathname) 
      window.scrollTo(0, 0);
    
  

  render() 
    const  children  = this.props;
    return children;
  


export default withRouter(ScrollToTop);

像这样将这个组件包裹在你的 App 周围:

render(
  <ScrollToTop>
    <App />
  </ScrollToTop>,
  document.getElementById('app'),
);

当路径改变时,您的应用现在应该会自动重置它的滚动位置。

【讨论】:

成功了!谢谢你让我注意到这个人。感谢您的宝贵时间。 没问题,很高兴能帮上忙。【参考方案2】:

您可以通过每次导航时自动滚动到页面顶部来解决此问题,但这实际上并不能解决根本问题。

问题

问题是你最外层的 div 是滚动的元素,当你导航时,你只渲染你已经滚动的 div 中的元素,这就是为什么你的新页面看起来好像你已经滚动了一部分下来(因为从技术上讲你有)

这是解决这个问题的一种干净的方法......

在外层 div 上停止滚动

在 App.js 的主 div 上添加 overflowY 样式为“隐藏”

在每个页面上启用滚动

将各个页面包装在一个 div 中,并将 overflowY 样式设置为“滚动”。我通常将其作为自己的功能组件,以便轻松地将其包裹在所有其他页面上

import React from 'react';

import './App.css'

import 
  BrowserRouter as Router,
  Switch,
  Route,
  withRouter
 from "react-router-dom";


function Page () 
  return (
    <div style=overflowY: 'scroll'>
     props.children
    </div>
  )



function App() 

  return (
    <div className="App">
      <Router>
      <div id="main" style=overflowY: 'hidden'>
      <Switch>
        <Route exact path="/screen1">
          <Page>
            <Screen1 />
          </Page>
        </Route>
        <Route path="/screen2">
          <Page>
            <Screen2 />
          </Page>
        </Route>
      </Switch>
      </div>
      </Router>
    </div>
  );


这样,每次导航到新页面时,滚动的 div 都会被清除并替换为新的 div。这会导致您始终从页面顶部开始。

【讨论】:

【参考方案3】:

对于 react-router-dom v6,我发现本页描述的解决方案:React Router Dom: Scroll To Top on Route Change 效果最好。

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于为啥我的 react-router 链接会将我带到页面中间?的主要内容,如果未能解决你的问题,请参考以下文章

设计忘记密码不起作用

通过 React-Router v4 <Link /> 传递值

为啥扩展语法会将我的字符串转换为数组?

使用 AJAX PHP JQuery 提交表单将我带到操作页面

如何抵消固定导航栏将我带到的位置?

如何从移动浏览器打开深层链接?