Tenho um problema ao navegar para outra página, sua posição permanecerá como a página anterior. Portanto, não vai rolar para cima automaticamente. Eu também tentei usar window.scrollTo(0, 0)
no roteador onChange. Também usei scrollBehavior para corrigir esse problema, mas não funcionou. Alguma sugestão sobre isso?
javascript
reactjs
react-router
react-router-redux
Adrian Hartanto
fonte
fonte
componentDidMount
do componente da nova rota?document.body.scrollTop = 0;
ocomponentDidMount
do componente para o qual você está movendoRespostas:
A documentação do React Router v4 contém exemplos de código para restauração de rolagem. Aqui está o primeiro exemplo de código, que serve como uma solução em todo o site para "rolar para o topo" quando uma página é navegada para:
Em seguida, renderize-o na parte superior do seu aplicativo, mas abaixo do Roteador:
^ copiado diretamente da documentação
Obviamente, isso funciona para a maioria dos casos, mas há mais informações sobre como lidar com interfaces com guias e por que uma solução genérica não foi implementada.
fonte
Because browsers are starting to handle the “default case” and apps have varying scrolling needs (like this website!), we don’t ship with default scroll management. This guide should help you implement whatever scrolling needs you have.
me deixa triste, porque todas as opções que eles fornecem para fornecer exemplos de código podem ser incorporadas ao controle por meio de configurações de propriedade, com algumas convenções sobre o comportamento padrão que podem ser alteradas. Isso parece super hacky e inacabado, imho. Significa que apenas os desenvolvedores de reação avançada podem fazer o roteamento corretamente e não #pitOfSuccesswork-arounds
aqui ignoraram. +100 para @danielnixonmas as aulas são tão 2018
Implementação de ScrollToTop com React Hooks
ScrollToTop.js
Uso:
ScrollToTop também pode ser implementado como um componente wrapper:
ScrollToTop.js
Uso:
fonte
scrollToTop
a<Route>
. Parece ser um recurso usado com frequência.action !== 'POP'
. O ouvinte aceita a ação comoEsta resposta é para código legado, para roteador v4 + verifique outras respostas
Se não estiver funcionando, você deve descobrir o motivo. Também dentro
componentDidMount
você poderia usar:
você pode adicionar algum sinalizador como "scrolled = false" e depois atualizar:
fonte
window.scrollTo(0,0);
onUpdate
hook está obsoleto no react-router v4 - só quero salientar issoonUpdate
gancho?Para o react-router v4 , aqui está um app create-react que consegue a restauração do scroll: http://router-scroll-top.surge.sh/ .
Para conseguir isso, você pode criar, decorar o
Route
componente e aproveitar métodos de ciclo de vida:Em
componentDidUpdate
, podemos verificar quando o caminho de localização muda e combiná-lo com opath
prop e, se estiver satisfeito, restaurar a rolagem da janela.O que é legal nessa abordagem, é que podemos ter rotas que restauram a rolagem e rotas que não restauram a rolagem.
Aqui está um
App.js
exemplo de como você pode usar o acima:Do código acima, o que é interessante apontar é que somente ao navegar
/about
ou/another-page
rolar para cima a ação será executada. No entanto, ao continuar/
nenhuma restauração de rolagem acontecerá.A base de código inteira pode ser encontrada aqui: https://github.com/rizedr/react-router-scroll-top
fonte
Home
. Agora role até o final doHome
e vá para 'AnotherPage' e não role. Agora, se você voltarHome
, esta página será rolada para o topo. Mas de acordo com sua resposta, ahome
página deve ser mantida rolada.É notável que o
onUpdate={() => window.scrollTo(0, 0)}
método está desatualizado.Aqui está uma solução simples para o react-router 4+.
fonte
#
e?
ao final do nosso url. No primeiro caso, você deve rolar não para o topo; no segundo caso, você não deve rolar de forma algumaSe você estiver executando o React 16.8+, isso é simples de lidar com um componente que irá rolar a janela para cima em cada navegação:
Aqui está o componente scrollToTop.js
Em seguida, renderize-o na parte superior do seu aplicativo, mas abaixo do Roteador
Aqui está em app.js
ou em index.js
fonte
Eu tive o mesmo problema com meu aplicativo. Usar o trecho de código abaixo me ajudou a rolar para o topo da página ao clicar no botão seguinte.
No entanto, o problema ainda persistia no navegador. Depois de muitas tentativas, percebi que isso era por causa do objeto de histórico da janela do navegador, que tinha uma propriedade scrollRestoration definida como auto. Definir isso como manual resolveu meu problema.
fonte
Em um componente abaixo
<Router>
Basta adicionar um React Hook (caso você não esteja usando uma classe React)
fonte
Quero compartilhar minha solução para aqueles que estão usando,
react-router-dom v5
uma vez que nenhuma dessas soluções v4 fez o trabalho para mim.O que resolveu meu problema foi instalar o react-router-scroll-top e colocar o wrapper
<App />
assim:e é isso! funcionou!
fonte
Os ganchos são combináveis e, desde o React Router v5.1, temos um
useHistory()
gancho. Portanto, com base na resposta de @zurfyx, criei um gancho reutilizável para esta funcionalidade:fonte
Um React Hook que você pode adicionar ao seu componente Route. Usando em
useLayoutEffect
vez de ouvintes personalizados.Atualização : Atualizado para usar em
useLayoutEffect
vez deuseEffect
, para menos problemas visuais. Isso se traduz aproximadamente em:useEffect
: renderizar componentes -> pintar na tela -> rolar para cima (efeito de execução)useLayoutEffect
: renderizar componentes -> rolar para cima (efeito de execução) -> pintar para a telaDependendo se você está carregando dados (pense em spinners) ou se você tem animações de transição de página,
useEffect
pode funcionar melhor para você.fonte
Minha solução: um componente que estou usando em meus componentes de telas (onde quero rolar para cima).
Isso preserva a posição de rolagem ao voltar. Usar useEffect () era problemático para mim, ao voltar o documento rolava para cima e também piscava quando a rota era alterada em um documento já rolado.
fonte
React hooks 2020 :)
fonte
const ScrollToTop: React.FC = () => {
Não entendo o queScrollToTop: React.FC
significaEscrevi um componente de ordem superior chamado
withScrollToTop
. Este HOC possui dois sinalizadores:onComponentWillMount
- Se rolar para cima durante a navegação (componentWillMount
)onComponentDidUpdate
- Se rolar para cima na atualização (componentDidUpdate
). Este sinalizador é necessário nos casos em que o componente não é desmontado, mas ocorre um evento de navegação, por exemplo, de/users/1
para/users/2
.Para usá-lo:
fonte
Aqui está outro método.
Para o react-router v4, você também pode vincular um ouvinte para alterar o evento de histórico, da seguinte maneira:
O nível de rolagem será definido como 0 sem
setImmediate()
muito se a rota for alterada clicando em um link, mas se o usuário pressionar o botão Voltar no navegador, então não funcionará porque o navegador redefinirá o nível de rolagem manualmente para o nível anterior quando o botão Voltar for pressionado , então, ao usar,setImmediate()
fazemos com que nossa função seja executada depois que o navegador terminar, redefinindo o nível de rolagem, dando-nos o efeito desejado.fonte
com o roteador React dom v4 você pode usar
crie um componente scrollToTopComponent como o mostrado abaixo
ou se você estiver usando guias, use algo como o abaixo
espero que isso ajude para obter mais informações sobre restauração de rolagem visita lá docs hare react router dom restauração de rolagem
fonte
Eu descobri que
ReactDOM.findDomNode(this).scrollIntoView()
está funcionando. Eu coloquei dentrocomponentDidMount()
.fonte
Para aplicativos menores, com 1-4 rotas, você pode tentar hackea-lo com redirecionamento para o elemento DOM superior com #id em vez de apenas uma rota. Então, não há necessidade de agrupar Rotas em ScrollToTop ou usando métodos de ciclo de vida.
fonte
No seu
router.js
, basta adicionar esta função norouter
objeto. Isso fará o trabalho.Como isso,
**Routes.js**
fonte
Pode ser uma solução simples caso os adereços não sejam alterados e o componentDidUpdate () não seja acionado.
fonte
Isso é hacky (mas funciona): acabei de adicionar
window.scrollTo (0,0);
para renderizar ();
fonte